《求和》与《求出e的值》
这两个题目虽然是基础题,但也可以用到递推的思想。这里我自我总结下经常性犯的错误。
《求和》
描述
求Sn = a + aa + aaa + … + aa…a 的值(最后一个数中 a 的个数为 n ),其中 a 是一个1~9的数字,例如:
2 + 22 + 222 + 2222 + 22222 (此时 a=2 n=5 )
输入一行,包括两个整数,第一个为a,第2个为n(1 ≤ a, n ≤ 9),以空格分隔。
输出一行,Sn的值。
样例输入
2 5
样例输出
24690
源代码1:
#include<iostream> #include <cmath> using namespace std; int add(int a,int n) { int b[10],i,sum=a; b[1]=a; for(i=2;i<=n;i++) { b[i]=a*pow(10,i-1)+b[i-1]; sum+=b[i]; } return sum; } int main() { int a,n; cin>>a>>n; cout<<add(a,n)<<endl; return 0; }
源代码2:
#include<iostream> using namespace std; int add(int a,int n) { long int b[10],i,sum=a,j,t=1; b[1]=a; for(i=2;i<=n;i++) { t=t*10; //与源代码1不同的地方 b[i]=a*t+b[i-1]; //与源代码1不同的地方
sum+=b[i];
}
return sum;
}
int main() { int a,n; cin>>a>>n; cout<<add(a,n)<<endl; return 0; }
两个代码提交都成功了,但是代码一在CodeBlocks12.11.编译器上运行时始终出错,这样足足浪费了我两个小时;我感觉是编译版本的问题,可见有两个编译器是个不错的选择
我另一个是Visual C++ 6.0,简洁方便,感觉也挺好用的,就是界面不是很好,我学习C++就是用它来练习的,所以一直没舍得删掉,没想到现在派上用场了,不错。
在CodeBlocks12.11.编译器上我改的代码2成功通过,在没上述问题之前,我是不敢再用pow()函数了;
《求出e的值》:
描述 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e 。 输入 输入只有一行,该行包含一个整数n(2<=n<=15),表示计算e时累加到1/n!。 输出 输出只有一行,该行包含计算出来的e的值,要求打印小数点后10位。 样例输入 10 样例输出 2.7182818011 提示 1、e以及n!用double表示 2、要输出浮点数、双精度数小数点后10位数字,可以用下面这种形式: printf("%.10f", num);
源代码:
#include<iostream> #include <stdio.h> using namespace std; double e(int n) { int i; double b[16]; double sum=1.0,t=1.0; for(i=1;i<=n;i++) { t=t*i; b[i]=1/t; sum=sum+b[i]; } return sum; } int main() { int n; double sum; cin>>n; sum=e(n); printf("%.10f", sum); return 0; }
问题分析:
出错分析:题目很简单,犯的都是一些低级的错误,比如函数的返回值必须是double 类型,但不小心写成int 类型,
递推的时候 一定要明白后面的值到底与哪个变量有关,如代码中的b[i]实际与 (n-1) ! 有关而不是与b[i-1]有关;
书山有路勤为径,学海无涯苦作舟!!!