循环嵌套

循环嵌套

一、题目

求 s = a+aa+aaa+… …+aaa…a的值,其中a是一个数字,如2+22+222+2222,a的值和加数个数n,均从键盘获取。要求a属于[1,9],n小于10(如果不满足此条件,就重新输入)。
输入:输入a值和n值
输入提示信息:”Please input a:”
输入格式:”%d”
输入提示信息:”Please input n:”
输入格式:”%d”

输出:算式及和
输出提示信息:
“Sum=算式”,输出格式提示:采用 “Sum=”, “%ld”, “+%ld”
“Sum=和”,输出格式”\nSum=%ld\n”

程序运行示例:
Please input a:8
Please input n:9
Sum=8+88+888+8888+88888+888888+8888888+88888888+888888888
Sum=987654312

二、我写的代码

这是我的写的第一个双循环,总共花了我一个小时,中途没有借助豆包等大语言模型,仅仅使用了visual studio实现了代码的逐句执行

以下是我写的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <math.h>
int main()
{
int a, n;
int i = 2, j = 1, k, p = 1;
int solo = 0, each = 0, Sum = 0;
printf("Please input a:");
scanf_s("%d", &a);
printf("Please input n:");
scanf_s("%d", &n);
printf("Sum=%d", a);
while (i <= n) { //打印的循环
printf("+%d", a);
while (j <= i - 1) {
printf("%d", a);
j++;
}
j = 1;
i++;
} //计算的循环
for (k = 1;k <= n;k++) {
while (p <= k) {
solo = a * pow(10, p - 1); //solo为每一项的每一位!
each += solo; //each为每一项
p++;
}
Sum += each; //sum把每一项加起来
p = 1; //必要的归位,不然每一次循环后p都不是从1开始自加到k
each = 0; //同理避免计算下一项的时候下一项已经有初始值了
}
printf("\nSum=%ld\n", Sum);

return 0;
}

虽然很复杂,但总归是实现了题目中的要求。

三、自我反思

我所反思出来的:

  • 优点

    • “Sum=算式”这部分代码应该是最简,可读性也高
  • 缺点

    • “Sum=和” 这部分代码可读性低
    • 被迫使用了pow函数,有没有更好的解决方法?
    • p和each需要归位,我觉得有更好的解决方法
    • 变量太多,可读性差

四、自我优化

优化个蛋,我什么都不懂,感觉改不了,直接甩给豆包吧!

五、求助豆包

你的代码存在几个问题,以下是具体分析和修改后的代码:

问题分析:

  1. 输入合法性校验缺失:没有对输入的a(需在 [1,9])和n(需小于 10)进行校验,不符合题目要求。
  2. 算式输出逻辑复杂且低效:使用嵌套循环打印每一项,实际上可以通过迭代计算每一项的值并直接打印。
  3. 计算精度问题:使用pow(10, p-1)可能因浮点数精度误差导致计算错误,建议用整数迭代计算。
  4. 变量类型问题:当a=9n=9时,和为 987654312,超过int类型的最大范围(2147483647 在某些环境下可能刚好,但为保险起见应使用long类型)。

修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>

int main() {
int a, n;
// 输入a并校验
do {
printf("Please input a:");
scanf("%d", &a);
} while (a < 1 || a > 9); // 确保a在[1,9]

// 输入n并校验
do {
printf("Please input n:");
scanf("%d", &n);
} while (n >= 10); // 确保n小于10

long sum = 0;
long current = 0; // 存储当前项(如8,88,888等)

printf("Sum=");
for (int i = 1; i <= n; i++) {
current = current * 10 + a; // 迭代计算当前项,避免浮点数误差
sum += current;

// 打印算式,第一项不打印"+",后续项前加"+"
if (i == 1) {
printf("%ld", current);
} else {
printf("+%ld", current);
}
}

// 打印总和
printf("\nSum=%ld\n", sum);

return 0;
}

关键改进:

  1. 增加输入校验:使用do-while循环确保an满足题目要求的范围。
  2. 简化算式输出:通过current = current * 10 + a迭代计算每一项(如 8→88→888),直接打印该值,避免嵌套循环。
  3. 避免精度问题:用整数迭代替代pow函数,确保计算准确。
  4. 使用长整数类型long类型能容纳更大的计算结果,避免溢出。

程序运行示例与题目要求一致,且输入不合法时会重新提示输入。

六、自我改正

重新自己写了一份:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main()
{
int a, n;
int i=1;
int each=0,sum=0;
printf("Please input a:");
scanf_s("%d", &a);
printf("Please input n:");
scanf_s("%d", &n);
printf("Sum=");

while (i <= n) {
each = each * 10 + a;
if (i == 1) {
printf("%d", a);
}
else {
printf("+%d", each);
}
i++;
sum += each;
}
printf("sum=%d", sum);

return 0;
}

只是没有用豆包给的for循环,我用的while,确实简单很多了!!!

  1. 实现了每一项的叠加,这种每一项既可用于打印,也可用于求和
  2. 在循环中使用了if,将第一项的打印特殊化,避免另外说明

七、总结

  • 先分析每一项与前一项的关系,是否可以通过方程迭代
  • 尽量把每一项表示出来,会方便很多

循环嵌套
http://example.com/2025/11/10/循环嵌套/
作者
王柏森
发布于
2025年11月10日
许可协议