注册 登录
编程论坛 C++教室

加一句得不到预期的效果?

qlc00 发布于 2007-12-25 19:31, 2176 次点击
题目是:要算Sn=a+aa+aaa+aa+a(此时n=3,n表示的是aaa中连续a的个数)
代码是这样的
#include <iostream>
using namespace std;
int main()
{
    int a,n,i=1,sn=0,tn=0;
    cout<<"a,n="<<endl;
    cin>>a>>n;
    while(i<=n)
    {
        tn=tn+a;
        sn=sn+tn;
             sn=2*sn-tn;
        a=a*10;
        i++;
    }
    cout<<"a+aa+aaa+......="<<sn<<endl;
    return 0;
}
为什么答案对不住啊!
14 回复
#2
lonmaor2007-12-25 19:50
#include <iostream>
using namespace std;
int main()
{
    int a,n,i=1,sn=0,tn=0;
    cout<<"a,n="<<endl;
    cin>>a>>n;
    while(i<=n)
    {
        tn=tn*10+a;
        sn=sn+tn;
        i++;
    }
    cout<<"a+aa+aaa+......="<<sn<<endl;
    return 0;
}
#3
qlc002007-12-25 20:08
上面的好像也只能算a+aa+aaa这样的 ,但是后面的+aa+a没有算上啊!
#4
lonmaor2007-12-25 20:24
#include <iostream>
using namespace std;
int main()
{
    int a,n,i=1,sn=0,tn=0;
    cout<<"a,n="<<endl;
    cin>>a>>n;
    while(i<=n)
    {
        tn=tn*10+a;
        sn=sn+tn;
        i++;
    }
    sn=2*sn-tn;
    cout<<"a+aa+aaa+......="<<sn<<endl;
    return 0;
}

没仔细看题。不好意思
#5
Lonelie2007-12-25 20:54
你的算法是有问题的:
假设 n=3
第一次循环:tn=1
                         sn=1;
第二次循环:tn=11;
           sn=(1+11)*2-11=1+11+1;
第三次循环:tn=111;
                       sn=(1+11+1+111)*2-111=1+11+111+11+1+1+1;
显然多出了两个1;
其实你的原理是:
   递推关系:s(n)=2*[ s(n-1)+t(n)]-t(n)=2*s(n-1)+t(n);
这显然是不正确的!
改正:
 while(i<=n)
    {
        tn=tn+a;
        sn=sn+tn;
        a=a*10;
        i++;
    }
sn=2*sn-tn;
#6
StarWing832007-12-28 08:49
LS有没有仔细分析上面的程序呢?你们两个的算法都是正确的,第三次循环应该是
第三次循环:tn=111;
                       sn=(1+11+111)*2-111=1+11+111+11+1;
并没有多两个1,仔细分析了程序再发言吧……
#7
Lonelie2007-12-28 09:09

ls的再仔细看看
#8
StarWing832007-12-28 12:55
while(i<=n)
    {
        tn=tn*10+a;
        sn=sn+tn;
        i++;
    }
tn初值为0.,第一次循环后
tn=a;sn=tn=a,i=1;
第二次循环后:
tn=tn*10+a;即tn=aa;sn=sn+tn,即sn=a+aa;i=2
第三次循环后:
tn=tn*10+a=aa*10+a=aaa;sn=sn+tn=a+aa+aaa;i=3等于n,退出循环
结果sn=(a+aa+aaa)*2-aaa=a+a+aa+aa+aaa;

有异议吗?
#9
Lonelie2007-12-28 16:06
当然有异议了

如果按你写的程序,当然是正确的……
可你跟楼主的相比少一句sn=2*sn-tn
你分析的到底是谁的程序?
#10
StarWing832007-12-29 02:44
结果sn=(a+aa+aaa)*2-aaa=a+a+aa+aa+aaa;

是我不好,没有写出来那一句,但是我在分析过程里面已经写了那一句的后果了。如上。
执行到sn=2*sn-tn的时候,sn等于a+aa+aaa,tn=aaa(见上面的分析)
所以sn=2*(a+aa+aaa)-aaa=a+a+aa+aa+aaa+aaa-aaa=a+aa+aaa+aa+a;

一起讨论是好事情 LS再想想看~~
#11
Lonelie2007-12-29 10:34
回复 10# 的帖子
接着你的分析,你得到了sn=a+aa+aaa+aa+a;
那么下次再循环,执行完sn=sn+tn,sn=a+aa+aaa+aa+a+aaaa
再执行sn=2*sn-tn不是变成了sn=2*(a+aa+aaa+aa+a+aaaa)-aaaa了吗,
关键就在sn=2*sn-tn在循环里面,不是在循环外面
#12
zzxlyh2007-12-29 10:50
同意Lonelie的分析
#13
StarWing832007-12-29 11:01
我是说LS的和4楼的……误会了…………
#14
leeco2007-12-29 12:25
既然在算递推关系了为什么不把公式直接算出来,也不要循环做了不是更简单吗
#15
leeco2007-12-31 16:09
顶上去。
1