《求和》与《求出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]有关;

 

 

posted on 2013-08-06 10:27  天梦Interact  阅读(485)  评论(0编辑  收藏  举报