C语言学习笔记20260610- 数列求和 a+aa+aaa+aaaa 三种解法
一、题目要求
计算数列前 n 项和:Sn = a + aa + aaa + aaaa + ...
示例:a=2,n=5
输出格式:求和式子:2 + 22 + 222 + 2222 + 22222 = 24690
数据范围:a 为单个数字,n 为项数
二、解法一:递推迭代法(最优、首选)
1. 核心思路
利用递推公式生成每一项,无需幂函数、无需嵌套循环,效率最高。
递推公式:当前项 = 前一项 * 10 + a
-
第1项:0 * 10 + 2 = 2
-
第2项:2 * 10 + 2 = 22
-
第3项:22 * 10 + 2 = 222
2. 完整代码
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a, n;
// 输入数字a和项数n
printf("请输入 数字a 和 项数n:\n");
scanf("%d %d", &a, &n);
int sum = 0; // 存储总和
int current = 0; // 存储当前生成的项
printf("求和式子:");
// 循环生成n项
for (int i = 0; i < n; i++)
{
// 递推生成当前项
current = current * 10 + a;
// 累加至总和
sum += current;
// 格式控制:最后一项不输出"+"
if (i == n - 1)
printf("%d", current);
else
printf("%d + ", current);
}
// 输出最终结果
printf(" = %d\n", sum);
return 0;
}
3. 优缺点
优点:代码简洁、运行效率最高、无浮点精度误差
三、解法二:双层循环法(最通俗易懂)
1. 核心思路
外层循环控制项数,内层循环单独生成每一项数字,逻辑直白,新手最好理解。
例如:第3项,循环3次拼接出 222。
2. 完整代码
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a, n;
printf("请输入 数字a 和 项数n:\n");
scanf("%d %d", &a, &n);
int sum = 0;
printf("求和式子:");
// 外层循环:控制一共有n项
for (int i = 1; i <= n; i++)
{
int term = 0; // 存储当前项,每次清空重新生成
// 内层循环:生成第i项 i位数
for (int j = 0; j < i; j++)
{
term = term * 10 + a;
}
sum += term;
// 格式输出
if (i == n)
printf("%d", term);
else
printf("%d + ", term);
}
printf(" = %d\n", sum);
return 0;
}
3. 优缺点
优点:逻辑直观、层层拆解、极易理解
缺点:嵌套循环,运算次数多,效率偏低
四、解法三:pow幂函数法(数学公式思路)
1. 核心思路
利用数学幂运算公式生成每一项,贴合数学思维,是初学者最容易想到的方法。
公式:第i项 = a*10^0 + a*10^1 + ... + a*10^i
需引入头文件 math.h,使用 pow() 函数。
2. 完整代码
c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main()
{
int a, n;
printf("请输入 数字a 和 项数n:\n");
scanf("%d %d", &a, &n);
int sum = 0;
int current = 0;
printf("求和式子:");
for (int i = 0; i < n; i++)
{
// 利用幂函数累加生成当前项
current += a * pow(10, i);
sum += current;
// 格式输出
if (i == n - 1)
printf("%d", current);
else
printf("%d + ", current);
}
printf(" = %d\n", sum);
return 0;
}
3. 优缺点
优点:贴合数学公式,思路直白
缺点:pow为浮点函数,存在精度丢失风险,不推荐竞赛/考试使用
六、统一运行效果
三种代码运行输出完全一致:
Plain
请输入 数字a 和 项数n:
2 5
求和式子:2 + 22 + 222 + 2222 + 22222 = 24690