分析问题:
这是一道循环结构的题,要求我们计算前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 1int 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 <stdio.h>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;
}
实际上还有其他的方法,想出了方法尽量付诸实践,把代码块写出来,报错再修复,我认为这才能真正提升。
如果有其他方法欢迎评论,互相学习!