作为初学者,被本题搞得焦头烂额,特此梳理思路
问题:
1、如何实现n项阶乘求和
2、如何判断 和<=X
3、编译过程中,如何防止int n 未初始化的问题(见错误示例)
错误示例
#include<iostream>
using namespace std;
int main()
{
int n, sum=0;
int r=1;
int X;
cin>>X;
for(int i=1; i<=n; i++)
{
{ r*=i;
sum +=r;
}
if (sum>X)
break;
cout<<n-1<<endl;}
return 0;
}
此时提示:
a.cpp: In function ‘int main()’:
a.cpp:10:16: warning: ‘n’ is used uninitialized in this function [-Wuninitialized]
for(int i=1; i<=n; i++)
~^~~
在搜索引擎上查询,很难找到符合本题要求的解决方案。
只能已知变量n需要“赋值”(不知道能否如此理解),来帮助计算机利用变量n。
但是依题知,变量n决不能赋常量,否则输出结果为“常量-1”
(例如int X=100,n=100; 结果为99,而非4。)
那么关键在于如何在“赋值”的基础上,令n仍为“变量”。
于是我们对本题的变量n进行理解:n可以作为项数,并不是没有限制,而是随着i的自增而增大
(例如,i=1,n=1该项为1; i=3,n=3,该项为6)
所以n与i有如下关系:i自增的同时,n也可以由小到大(n++),保持变化。
那么就可以令 int n=1; 同时在循环语句中使n自增。问题得解。
小白的正确答案:
#include<iostream>
using namespace std;
int main()
{
int n=1, r=1;
int sum=0;
int X;
cin>>X;
for(int i=1; i<=n; i++,n++)
{
r*=i;
sum +=r;
if (sum>X)
{
break;
}
}
cout<<n-1<<endl;
return 0;
}