C语言没有这种类型的函数。C语言学的函数只有内部函数与外部函数。一般定义的函数默认都是外部函数(即允许别人在一个系统的其他程序中调用)。内部函数是在定义时在函数头部函数名前加static,用来限定这个函数只能用在本程序中(即只能在本程序中调用,不允许别人在其他函数中调用)。
#include<stdioh>
int main(){
int i,n,m,a,b,count=0;
int facsum(int n);
scanf("%d%d",&m,&n);
for(;m<=n;m++) {
a=facsum(m);
if(m<a);
b=facsum(a);
if(m==b&&m<a)
printf("%5d%5d\n",m,a);
if(m==a)
count++;
}
printf("%5d\n",count);
return 0;
}
int facsum(int n){
int i,s=0,m=n/2;
for(i=1;i<=m;i++){
if(n%i==0)
s=s+i;
}
return s;
}
将双重循环改为单次循环,可大大减少运行时间!
同学,你是刚学C语言吗?如果是的话,这样写就很不错了,因为你知识还不全。可优化的地方确实还有,比如,当你学过数组后,可以用数组储存你的不同年限的利率,这样方便调用,编程的时候也不容易错。你的5个函数形成的功能是类似的,可以合写成一个函数。doubleaction(doublec,doubleyear)//C是本金,year是存几年{c=c(1+yearr[year]);returnc;}这样的话,你的5年,可写为sum=cap;sum=action(sum,5);先3,后2写为sum=cap;sum=action(action(sum,3),2);存活期比较特殊,你可以再写一个这样的话,能省下不小代码量,还有你的计算活期的action5有点毛病for(i=1;i<=4;i++)a=(1+r6/4);这个a是不是不该这么算改写为a=1;for(i=1;i<=4;i++)a=a(1+r6/4);才对吧。还有编程风格(你起的函数名用action不太好吧,太笼统了)大概就是这些
这个程序有多组输入,而这多组输入的运算都是相同的,所以可以利用数组f之前计算过的信息。
在你的code里做的修改,如果有疑问,欢迎交流
#include<stdioh>int main()
{
int a,b,n,c;
int pre_max_idx = 2;
int f[100];
f[1]=1;
f[2]=1;
while(scanf("%d%d%d",&a,&b,&n)!=EOF)
{
if(n<=pre_max_idx){//如果之前计算过就直接返回
printf("%d\n", f[n]);
continue;
}
if(n<=0)
continue;
for(c=n+1,n=pre_max_idx+1;n!=c;n++)//这里从pre_max_idx开始
f[n]=(af[n-1]+bf[n-2])&7;
pre_max_idx = n-1;//修改当前的最大
printf("%d\n",f[n-1]);
}
return 0;
}
“那我能不能列一个一万个浮点数的数组”
当然可以。这是典型的空间换效率。
“64k单片机是不是就可以写入64×1024=65536个字节”
是的。撑死就这么大。
不过可以通过外部寻址空间扩充存储器,理论上无限……
算法描述
转某牛人的解题报告!!!!
这道题在没看数据规模之前以为是一道简单的DP,但是数据开到十亿,无论在时间还是空间复杂度都过大,所以就要进行优化了。
解一:
简单方法:预期得分30。简单动态规划,f[i]代表青蛙跳到i点时所可能踩到的最少石子数,所以有f[i]=min{f[k]+map[i]}(i-s≤k≤i-t),其中map[i]代表i上是否有石子,有是1,否则0。算法复杂度O(n^2)。
解二:
改进方法:预期得分100。我们会发现,虽然桥很长,但上面最多只有100个石子,想到能否用石子DP,而应该是不行的。那能否基于第一种方法?由于石子排布非常的疏,我们还会发现,如果两个石子相隔甚远,那他们中间的f[i]大部分将会是同一个数,能否把两个石子的距离缩短,使之还与原来等效?要是行的话怎么缩?王乃岩同学考试时做了一个方法能够过全部数据,用的滚动数组存储,下面列出了他的程序。我自己也写了个程序,和他不尽相同:我令L=stone[i]-stone[i-1](stone[i]代表按坐标由小到大顺序排列的石块坐标),当L能够被t整除时(L%t==0),令k=t;当L不能被t整除时(L%t!=0),令k=L%t。然后令k为k+t,最后判断如果k>L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为L(也就是没变);如果k<=L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为k,可以看出来,这样处理完,两石子最大间距为2t,大大的缩短了数组,再按解一进行DP,就可以通过了。
#include <stdioh>
#include <stringh>
long stone[101];
int map[100001];
int f[100001];
long L;
int S, T, M;
void quickSort(int l, int r)
{
int i , j;
long temp;
i = l;
j = r;
temp = stone[i];
while (i < j)
{
while (i < j && stone[j] > temp)
j--;
if (i < j)
{
stone[i] = stone[j];
i++;
}
while (i < j && stone[i] < temp)
i++;
if (i < j)
{
stone[j] = stone[i];
j--;
}
}
stone[i] = temp;
if (i - 1 > l) quickSort(l, i - 1);
if (i + 1 < r) quickSort(i + 1, r);
}
int main()
{
int i, j;
long l, k, p = 0, min;
scanf("%ld%d%d%d", &L, &S, &T, &M);
for (i = 1; i <= M; i++)
scanf("%ld", &stone[i]);
memset(map, 0, sizeof(int)100001);
memset(f, 0, sizeof(int)100001);
quickSort(1, M);
stone[0] = 0;
p = 0;
for (i = 1; i <= M; i++)
{
l = stone[i] - stone[i - 1];
if (l % T == 0)
k = T;
else
k = l % T;
k = k + T;
if (l < k)
k = l;
p = p + k;
map[p] = 1;
}
for (i = 1; i <= p + T; i++)
{
min = 1000;
for (j = i - T; j <= i - S; j++)
if ( j >= 0 && f[j] < min)
min = f[j];
f[i] = min + map[i];
}
min = 1000;
for (i = p + 1; i <= p + T; i++)
if (f[i] < min)
min = f[i];
printf("%d\n", min);
return 0;
}
以上就是关于C语言函数调用优化全部的内容,包括:C语言函数调用优化、C语言紧急求救!!! 这个程序运行时间太长了,怎么改,是他优化一下非常感谢!!!!!!、请优化下面的c语言代码,让这个程序的执行时间在30ms以内,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)