C语言函数调用优化

C语言函数调用优化,第1张

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以内,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9749427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存