分析问题:
这是一道循环结构的题,要求我们计算前n项和,本质上是需要我们计算出a,aa,aaa,aaaa…这些数字。
这些数字有很多规律,循环结构正是需要用规律解题,所以你使用了什么规律,就决定了编写程序的难易。
以2+22+222+2222…为例:
我刚开始想的时候,无非认为应该这样求第n项:2*(10 ^ 0) + 2*(10 ^ 1) + 2 * (10 ^ 2)…我把每一位的2拆开,就把计算第n项变成了计算2 + 22 + 222…的值,看起来似乎没有问题,可我还是没有写出来(以后再试试)。
上面的方法是单独观察每一项。如果这种方法不行,可以试试观察两项之间的规律所在。比如前两项,2和22,22 = 20 + 2;第2项和第3项,222 = 220 + 2 = 22 ^ 10 + 2;渐渐的,可以发现前一项乘10,再加上a就能得到下一项了。
错误代码:
到这里还没完,要把代码正确写出才算真正解决问题。在这其中又会发现许多问题:
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
int Sn = 0;
int a = 0;
int n = 0;
scanf("%d %d", &a, &n);
int i = 0;//循环的临时变量
for (i = 1; i <= n; i++)
{
a = a + 2;
Sn = Sn + a;
a = a * 10;
}
printf("Sn=%d", Sn);
return 0;
}
在这里面的代码中,如果只看到了题目中的"2,22,222…",直接把2套入公式,虽然也能得到答案,如果换一个数字,程序就不再适用,并且上面scanf输入的数字也作废了。
修改后正确代码:
程序需要兼容任何一种可能性,因此需要把for循环中的数字"2"替换为真正的"a",同时也要修改for循环内的代码块。
#define _CRT_SECURE_NO_WARNINGS 1
#include <>
int main()
{
int Sn = 0;//前n项和
int p = 0;//把第n项存进去
int a = 0;//想要输入的数字
int n = 0;//需要计算前几项
scanf("%d%d", &a, &n);
int i = 0;//循环的临时变量
for (i = 1; i <= n; i++)
{
p += a;//第n项存进来
Sn += p;//用于计算前n项和
a = a * 10;//给a乘10,再与循环中的第一项配合,从而计算出第n项
}
printf("Sn=%d", Sn);
return 0;
}
实际上还有其他的方法,想出了方法尽量付诸实践,把代码块写出来,报错再修复,我认为这才能真正提升。
如果有其他方法欢迎评论,互相学习!