当前位置: 首页 > article >正文

C语言实例_16之求不同位数为同一个数的和

1. 题目

s = a + a a + a a a + a a a a + a a . . . a s = a + aa + aaa + aaaa + aa...a s=a+aa+aaa+aaaa+aa...a的值,其中 a a a是一个数字,相加的项数由键盘输入控制,例如当 a = 2 a = 2 a=2,项数为 5 5 5时,就是求 2 + 22 + 222 + 2222 + 22222 2 + 22 + 222 + 2222 + 22222 2+22+222+2222+22222的值。

2. 分析

  1. 需要从键盘获取两个信息,一个是数字 a a a的值,另一个是相加的项数 n n n
  2. 然后通过循环来依次生成每一项的值并累加起来得到总和 s s s。在生成每一项时,可以利用上一项的值来构建下一项。例如,已知当前项为 a a a aaa aaa,那么下一项 a a a a aaaa aaaa就可以通过将当前项乘以 10 10 10再加上 a a a得到。

3. 实例代码

#include <stdio.h>
#include <math.h>

int main() {
    int a, n;
    printf("请输入数字a的值:");
    scanf("%d", &a);
    printf("请输入相加的项数n:");
    scanf("%d", &n);

    int sum = 0;
    int term = 0;

    for (int i = 1; i <= n; i++) {
        term = term * 10 + a;
        sum += term;
    }

    printf("s的值为:%d\n", sum);

    return 0;
}

4. 输出结果

假设输入数字 a a a的值为 3 3 3,相加的项数 n n n 4 4 4,则程序运行后的输出结果如下:

请输入数字a的值:3
请输入相加的项数n:4
s的值为:3702

根据输入的 a = 3 a = 3 a=3 n = 4 n = 4 n=4,通过程序计算得到了 s = 3 + 33 + 333 + 3333 = 3702 s = 3 + 33 + 333 + 3333 = 3702 s=3+33+333+3333=3702的值。

5. 递归实现

  • 递归思路:
  1. 使用递归计算这个式子的值,可以把整个式子的求和看成是一个递归问题。可以将式子拆分成多个部分,每一部分都可以通过递归的方式来计算。
  2. 对于第n项的值,可以看作是第n-1项的值乘以10再加上a。例如,第三项aaa,它的值就等于第二项aa的值乘以10再加上a。
  3. 整个式子的和s,就是第n项的值加上前n-1项的和,这个前n-1项的和又可以通过递归调用函数自身来计算。
  • 递归终止条件:
  1. 当项数为1时,也就是只需要计算第一项的值,此时返回a即可,这就是递归的终止条件。
#include <stdio.h>

// 递归函数用于计算每一项的值
int calculateTerm(int a, int n) {
    if (n == 1) {
        return a;
    } else {
        return calculateTerm(a, n - 1) * 10 + a;
    }
}

// 递归函数用于计算式子的总和
int calculateSum(int a, int n) {
    if (n == 1) {
        return a;
    } else {
        return calculateTerm(a, n) + calculateSum(a, n - 1);
    }
}

int main() {
    int a, n;
    printf("请输入数字a的值:");
    scanf("%d", &a);
    printf("请输入相加的项数n:");
    scanf("%d", &n);

    int sum = calculateSum(a, n);

    printf("s的值为:%d\n", sum);

    return 0;
}

可以将以上俩递归函数合并为一个:
通过增加isSum参数巧妙地实现了在一个函数中既可以计算每一项的值,又可以计算总和的功能。

#include <stdio.h>

// 合并后的递归函数
int calculate(int a, int n, int isSum) {
    if (n == 1) {
        return a;
    }
    int currentTerm;
    if (!isSum) {
        // 计算当前项的值
        currentTerm = calculate(a, n - 1, false) * 10 + a;
        return currentTerm;
    } else {
        // 计算总和
        int currentSum = calculate(a, n, false) + calculate(a, n - 1, true);
        return currentSum;
    }
}

int main() {
    int a, n;
    printf("请输入数字a的值:");
    scanf("%d", &a);
    printf("请输入相加的项数n:");
    scanf("%d", &n);

    int sum = calculate(a, n, true);
    printf("s的值为:%d\n", sum);

    return 0;
}

6. 算法库实现

#include<stdio.h>
#include<math.h>

int main()
{
    int i, a, n, sum=0;
    printf("请输入 a 和 n:\n");
    scanf("%d%d", &a, &n);
    for(i=0; i<n; i++)
    {
        sum += a*pow(10, i)*(n-i);
    }
    printf("sum is %d\n", sum);
    return 0;
}

以输入 a = 2n = 3 为例,解释:

循环会执行三次(因为 i0 开始,每次递增 1,直到 i < n,即 i < 3),下面分别分析每次循环的计算过程:

  1. 第一次循环(i = 0):
  • 此时进入循环体,计算 a*pow(10, i)*(n - i) 的值:
    • 首先计算 pow(10, i),因为 i = 0,所以 pow(10, 0) 等于 1(任何非零数的 0 次幂都为 1)。
    • 然后计算 a*pow(10, i),已知 a = 2,那么 a*pow(10, i) 就等于 2 * 1 = 2
    • 最后计算 a*pow(10, i)*(n - i),因为 n = 3,所以 (n - i) 等于 3 - 0 = 3,那么整个式子的值就是 2 * 3 = 6
  • 将这个值累加到 sum 中,此时 sum 初始值为 0,累加后 sum = 0 + 6 = 6
  1. 第二次循环(i = 1):
  • 再次进入循环体,重新计算 a*pow(10, i)*(n - i) 的值:
    • 先算 pow(10, i),由于 i = 1,所以 pow(10, 1) 等于 10
    • 接着算 a*pow(10, i)a = 2,则 a*pow(10, i) 变为 2 * 10 = 20
    • 最后算 a*pow(10, i)*(n - i)n = 3,此时 (n - i) 等于 3 - 1 = 2,所以整个式子的值为 20 * 2 = 40
  • 把这个值累加到 sum 中,之前 sum = 6,现在累加后 sum = 6 + 40 = 46
  1. 第三次循环(i = 2):
  • 又一次进入循环体,继续计算 a*pow(10, i)*(n - i) 的值:
    • 先求 pow(10, i),因为 i = 2,所以 pow(10, 2) 等于 100
    • 再求 a*pow(10, i)a = 2,那么 a*pow(10, i) 就是 2 * 100 = 200
    • 最后求 a*pow(10, i)*(n - i)n = 3(n - i) 等于 3 - 2 = 1,所以整个式子的值为 200 * 1 = 200
  • 将这个值累加到 sum 中,原先 sum = 46,累加后 sum = 46 + 200 = 246

经过这三次循环后,循环结束,此时 sum 的值就是按照式子 s = a + aa + aaa + aaaa + aa...a(这里是 2 + 22 + 222)计算得到的总和,即 246


http://www.kler.cn/a/417267.html

相关文章:

  • CPU的基本结构
  • 【C++篇】C++11新特性总结1
  • 个人笔记---关于详解threadlocal 上下文环境存储的最佳数据类型
  • 免费windows pdf编辑工具
  • 语言月赛 202311【基因】题解(AC)
  • 【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据
  • Flutter:city_pickers省市区三级联动
  • npm install -g@vue/cli报错解决:npm error code ENOENT npm error syscall open
  • 下载SRA序列数据——ascp(前期草稿,未上传待更新)
  • 亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜
  • Python `async def` 函数中使用 `yield` 和 `return` 的区别
  • ffmpeg 各版本号对应表格
  • uni-app 使用笔记
  • ctrl键和大写键互换解决方法
  • TYUT设计模式精华版
  • 简单获取json预览
  • 每天五分钟深度学习框架pytorch:卷积神经网络的搭建
  • 自然语言处理:基于BERT预训练模型的中文命名实体识别(使用PyTorch)
  • Python Web 开发:FastAPI 入门实战 —— HTTP 基础与 RESTful API 设计
  • Python学习笔记之IP监控及告警
  • C/C++ 数据结构与算法【线性表】 顺序表+链表详细解析【日常学习,考研必备】带图+详细代码
  • 【AI系统】传统编译器发展
  • 使用1panel一键安装Ollama WebUI连接本地Ollama使用开源ai模型
  • 软件测试之bug分析定位技巧
  • 元器件选型与参数13 电源的分类-线性电源参数 RT9013 AMS1117 PCB布局布线
  • 基于HTML和CSS的校园网页设计与实现