一、算法分析:
要计算a b之间所有奇数和,那么最朴素的算法可以设计如下:
1、输入a,b值;
2、循环遍历a b之间的所有数值,如果为奇数,则累加;
3、输出结果。
二、算法优化:
1、由于连续奇数之间差值为2,所以可以判断出第一个奇数,然后依次加2得到所有奇数,将所有奇数累加即可。
2、连续奇数属于等差数列,所以可以利用等差数列求和公式,更快捷的得到结果。
三、参考代码:
1、原始算法代码:
#include <stdio.h>
int add(int a, int b)
{
int m,n,s=0;
if(a<b) m=a,n=b;
else m=b,n=a;//判断a b大小,增加健壮性。
for(; m<=n; m ++)
if(m%2==1) s+=m;//判断并累加奇数。
return s; //返回结果。
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);//输入a,b值。
printf("%d\n", add(a,b));//计算并输出结果。
return 0;
}
2、优化算法1:
#include <stdio.h>
int add(int a, int b)
{
int m,n,s=0;
if(a<b) m=a,n=b;
else m=b,n=a;//判断a b大小,增加健壮性。
if(m%2==0) m+=1;//找到第一个奇数。
for(; m<=n; m +=2)//仅遍历奇数。
s+=m;//累加奇数。
return s; //返回结果。
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);//输入a,b值。
printf("%d\n", add(a,b));//计算并输出结果。
return 0;
}
3、优化算法2:
#include <stdio.h>
int add(int a, int b)
{
int m,n,s=0;
if(a<b) m=a,n=b;
else m=b,n=a;//判断a b大小,增加健壮性。
if(m%2==0) m+=1;//找到第一个奇数。
if(n%2==0) n-=1;//找到最后一个奇数。
s=(m+n)*((n-m)/2+1)/2;//根据等差数列求和公式计算和。
return s; //返回结果。
}
int main()
{
int a,b;
scanf("%d%d",&a,&b);//输入a,b值。
printf("%d\n", add(a,b));//计算并输出结果。
return 0;
}