编程计算 a+aa+aaa+…+aa…a(n个a)的值,n和a的值由键盘输入。例如,当n=4,a=2,表示计算2+22+222+2222的值。
程序运行结果示例:
Input a,n:
2,4↙
sum=2468
一开始以为这是个非常简单的问题。C实现代码如下:
1 #include<stdio.h> 2 #include<math.h> 3 int main(void) 4 { 5 int a = 0; 6 int n = 0; 7 int sum = 0; 8 int i,j; 9 int sum1 = 0; 10 11 printf("Input a,n: "); 12 scanf("%d,%d",&a, &n); 13 14 for(i = 0; i < n; i++) 15 { 16 for(j = 0; j <= i; j++) 17 { 18 sum += a*pow(10,j); 19 } 20 21 } 22 23 // sum1 = 2*pow(10,2); 24 //printf("%d ",2*pow(10,2)); 25 printf( "sum=%ld ", sum); 26 return 0; 27 }
程序的输出为2467,比正确值少1。debug发现pow(10,j),当进入循环j=2时,计算结果为99。单独计算pow(10,2)结果为100,非常奇怪。查看函数原型发现pow函数的入口和返回值都是double类型,
即double pow( double, double ),基本明白问题所在。我的奇葩编译器在数据类型转换时候出现了问题。改用其他编译器发现没有问题。不再使用pow库函数,改用递归解决此问题。
1 #inlcude <stdio.h> 2 int powCaculate(int a, int n); 3 int main(void) 4 { 5 int a = 0; 6 int n = 0; 7 int i = 0; 8 int sum=0; 9 10 printf("Input a,n: "); 11 scanf("%d,%d",&a, &n); 12 13 for(i = 0; i < n; i++) 14 { 15 printf("%d ",sum += powCaculate(a, i)); 16 } 17 18 return 0; 19 } 20 21 int powCaculate(int a, int n) 22 { 23 if(n == 0) 24 return a; 25 else if(n == 1) 26 return a*10 + a; 27 else 28 return powCaculate(a, n-1)*10 + 2; 29 }