C语言学习笔记20260610- 数列求和 a\+aa\+aaa\+aaaa 三种解法

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
相关推荐
老王爱玩车12 分钟前
动态内存管理
c语言·开发语言·学习·面试
海绵宝宝转agent13 分钟前
2026-10-9 leetcode100刷题+面经整理
笔记·算法·面试
yi01124 分钟前
DAY24: LeetCode 167:两数之和 II|从暴力枚举到左右双指针
笔记·python·算法·leetcode·二分查找·双指针
Logic10137 分钟前
C语言/数据结构数位DP题解:平滑排列数字统计——区间内相邻位差不超过K的数字个数
c语言·数据结构·动态规划·时间复杂度·数位dp·算法题·前导零处理
yi0111 小时前
LeetCode 15:三数之和|排序 + 双指针,如何避免重复答案?
笔记·python·算法·leetcode·双指针
Zwawa1 小时前
把 AO 接回来:黑线和白底之间到底差了多少
c语言·单片机·嵌入式
北风toto1 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记
EasyBr指纹浏览器1 小时前
我的开源项目:小红书笔记归档,把来源和缺项一起留下
笔记·小红书·开源工具·素材管理·内容归档
海海不掉头发1 小时前
图论及其应用_课堂笔记整理_CSDN博客
笔记·图论
志尊宝1 小时前
Vue3 零基础每日笔记(075):图片懒加载与骨架屏
javascript·vue.js·笔记