2,math.h中的函数用的时候要慎重,这些都是用来做复杂的数学计算的,时间开销都很大。
3,求余只能对整数操作,这点是必然的。但浮点数是可以转换成整数的,可以用强制类型转换,或者设一个整型的中间变量。注意浮点数转整数的时候是舍入的。当然,这里只是说这个事,不建议这样做。
建议的做法有两个,简单点延用原有的思路,可以自己写一个求10的k次方的函数,用整数进行运算。
int pow10n( int k )
{
r = 1
for(i=0i <k ++i)
r *= 10
return r
}
复杂点的做法是把求10的k次方这个运算和拆分n的循环嵌在一起,这个应该是正统的做法。
for( k=0k<3++k )
{
n %= 10
}
当然,这个算法得到的结果是逆序的,4、3、2、1
这有两个办法,一个是把结果顺序放到数组中,输出的时候把顺序倒过来,说白了是用中间变量。
另外一个办法是用栈,或者用递归(本质上也是用的栈),直接按逆序出结果。当然,这个方法对初学者有点难度了。
#include<stdio.h>#include<math.h>
int main()
{
int sum=0
int n,a
scanf("%d", &n)
for (int i=1i<=ni++)
{
a=pow(2,i)
sum=+sum
}
printf("%d\n", sum)
return 0
}
溢出了!,算法逻辑可能正确,但C的int范围只能算到12!,到13!就溢出了,17!当然不行了。尽量不要用pow这样的函数,更不要用直接求阶乘——
#include "stdio.h"int main(int argv,char *argc[]){
int i
double s,x,t
printf("Input x(x∈[0,5])...\nx=")
if(scanf("%lf",&x)!=1 || x<0 || x>5){//保证x∈[0,5],否则退出
printf("Input error, exit...\n")
return 0
}
for(s=t=i=1t>0.00001s+=((t*=x)/=i++))//不用阶乘,用t=t*x/i就避免了溢出
printf("%.4f\n",s)
return 0
}
运行样例: