问题描述
- 关于C++循环的一个循环问题
-
原题是求1-20各数的阶乘之和,我想用二重循环来做,代码如下:但是最终结果却与正确答案似乎不一样:
#include
using namespace std;
int a=1, b=0;
int m, n;
int main()
{
for (m = 1; m <= 20;m=m++)
{
for (n = 1; n <= m-1; n = n++)
a = a*n;
b = b + a;
}
cout << b << endl;
return 0;
}老师提供的正确答案如下:
#include "stdafx.h"
#include
using namespace std;
int a=1, b=0;
int m, n;
int main()
{
for (m = 1; m <= 20;m=m++)
{
a = a*m;
b = b + a;
}
cout << b << endl;
return 0;
}我用VS2015追踪得到的结果是第一个代码中最终a=0,第二个a= -2102132736
·················请问这到底是怎么回事ORZ············初学者求教啊
解决方案
关于第二个a=-2102132736,20的阶乘你用计算器算一下就知道是多少,这个很明显是溢出了,int类型无法满足,换成unsigned long long a=1, b=0;
关于你自己写的,要注意的是里面一个循环之前要加上a=1;这一句,原因自己想想。里面一个循环的循环条件也不对,不要-1吧,
还有,m=m++这样的写法,你确定没有写错?
解决方案二:
楼主的代码问题多多。
其中主要的问题是外层循环结束a没有复位,内层循环的边界有很多的问题。
老师的代码是正确的,但是定义了一个n没有使用
老师的思路不是很直接,但是也很清晰
a随着循环变量m记录m!
而b=1!+……+m!
解决方案三:
多练基本功。m=m++和m++是等效的,这种写法让人费解。两层循环会导致时间复杂度上升,没有必要,逻辑也没有写对。
解决方案四:
如果出现负数,说明溢出了,int最大只能表示21亿,换double或者long long看看
时间: 2024-08-30 22:16:25