一些学生,对编程很感兴趣,也会去做题,但当程序运行结果不正确时,往往不会去发现问题。这里给大家演示一个方法,可以帮助你看清楚程序的运行过程,从而自己发现问题,进而解决问题。
只有自己发现问题、解决问题,得到的成就感和幸福感才是实实在在的。
比如:输入一个整数n,计算 sum=1!+2!+3!+....+n!,输出 sum。
某个同学写出下面的程序:
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL n,f=1,sum=0,i,j;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
f=f*j;
}
sum=sum+f;
}
cout<<sum<<endl;
return 0;
}
运行测试1:
输入n为1时,应该:sum=1!=1
正确。
运行测试2:
输入n为2时,应该:sum=1!+2!=3
正确。
运行测试3:
输入n为3时,应该:sum=1!+2!+3!=9
错误!!!
为什么错误呢?他发现不了了,好学一点的,就火急火燎的找老师,不好学的就放弃了。
针对这种情况,请你学会这个方法:多加打印语句。
这个程序逻辑还是比较清楚的,就是求 i!,然后累计到sum上面。
导致sum出错误的地方,最大的可能就是在 i!。
那么,我们就把计算过程中的 i!和 sum都打印出来看看。
# include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL n,f=1,sum=0,i,j;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
f=f*j;
}
cout<<i<<"!="<<f<<endl;
sum=sum+f;
cout<<"sum="<<sum<<endl;
}
cout<<sum<<endl;
return 0;
}
然后测试:
输入3
我们发现在计算 3!时出错了。
为什么出错呢?
是因为在每次向 f 累乘时,f的初值都需要是 f=1. 而本程序恰恰遗忘了这一点, 使得f中的值一直都保留着上次 (i-1)!,所以 2!*1 *2 *3=12。
好了,本专题就到这里了,希望对初学者有帮助。