牛客网刷题 | BC87 数位之和

发布于:2024-05-17 ⋅ 阅读:(111) ⋅ 点赞:(0)

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


描述

求一个整数的所有数位之和

输入描述:

输入一行,包含一个整数。

输出描述:

一个整数. int范围内


解题思路 : 

用数组的形式把用户输入的数字存起来

然后遍历数组,将数组的每一位都加起来

存在sum里面

这是一开始想的,后来发现想多了,想复杂了,用去模运算就行了......


理解问题:题目要求输入一个整数,并计算出这个整数所有数位上的数字之和。

确定方法:为了得到一个整数的数位之和,我们需要将这个整数分解成各个数位上的数字,然后将它们相加。

分解整数:有几种方法可以分解整数:

数学方法:通过取模操作(%)和整除操作(/)来逐步分解整数。

字符串转换:将整数转换为字符串,然后遍历字符串中的每个字符。

数学方法详解

使用取模操作%可以得到整数的最低位数字。

使用整除操作/可以去掉整数的最低位数字,得到剩余的整数部分。

字符串转换方法详解

将整数转换为字符串,这样就可以直接访问每一位数字。

遍历字符串中的每个字符,将字符转换为对应的数字并累加。

实现逻辑

初始化一个变量来存储数位之和,通常初始化为0。

根据选择的方法(数学方法或字符串转换方法)来分解整数并计算数位之和。

在分解过程中,不断更新数位之和的值。

边界条件考虑

确保处理了所有可能的输入情况,包括正数、负数和0。

输出结果

完成数位之和的计算后,输出最终的结果。


代码 1 :

/* 包含标准输入输出库 */
# include <stdio.h>
/* 包含字符串处理库 */
# include <string.h>

int main() /* 主函数的开始 */
{
    /* 创建一个大小为10的字符数组,并初始化所有元素为0 */
    char arr[10] = {0};
    /* 使用scanf函数读取一个字符串,存储到arr数组中 */
    scanf("%s", arr);
    /* 初始化长度变量和数位之和变量 */
    int length = 0, sum = 0;
    /* 计算输入字符串的长度 */
    length = strlen(arr);
    /* 遍历字符串数组中的每个字符 */
    for (int a = 0; a < length; a++)
    {
        /* 将字符转换为对应的整数值,并加到sum变量上 */
        sum += arr[a] - '0';
    }
    /* 打印出数位之和 */
    printf("%d", sum);
    /* 主函数返回0,表示程序正常结束 */
    return 0;
}

代码 2 :

int main() /* 主函数的开始 */
{
    int a = 0; /* 定义一个整型变量a并初始化为0,用于存储用户输入的整数 */
    int b = 0; /* 定义一个整型变量b并初始化为0,用于存储每次取模操作的结果 */
    int c = 0; /* 定义一个整型变量c并初始化为0,用于累加数位之和 */

    scanf("%d", &a); /* 从标准输入读取一个整数值到变量a */

    for (; a != 0;) /* 开始一个无限循环,条件是a不等于0 */
    {
        b = a % 10; /* 使用取模操作符%得到a的最低位数字,赋值给b */
        a /= 10;     /* 将a除以10并取整,即去掉a的最低位数字 */
        c += b;      /* 将b的值累加到c上 */
    }

    printf("%d\n", c); /* 打印出数位之和c,并换行 */
    return 0; /* 主函数返回0,表示程序正常结束 */
}

这段代码通过一个无限循环,不断地使用取模操作得到整数的最低位数字,然后通过整除操作去除这个最低位数字,直到整数变为0。

在这个过程中,将每次得到的最低位数字累加到变量c中。最后,输出累加的结果c,即整数的所有数位之和。

代码 3 :

#include <stdio.h> /* 引入标准输入输出库,用于程序中的输入输出操作 */

int main() { /* 主函数的开始 */
    int num = 0; /* 定义一个整型变量num并初始化为0,用于存储每次读取的数字 */
    int sum = 0; /* 定义一个整型变量sum并初始化为0,用于累加读取到的所有数字 */

    /* 使用while循环进行持续读取,条件是读取操作不返回文件结束标志EOF */
    while (scanf("%1d", &num) != EOF) {
        sum += num; /* 将读取到的数字num加到累加器sum上 */
    }

    printf("%d", sum); /* 打印出累加器sum的值,即所有读取数字的总和 */
    return 0; /* 主函数返回0,表示程序正常结束 */
}

这段代码的目的是从标准输入读取一系列数字,并将它们累加起来。

它使用了scanf函数来读取数字,并且指定了格式%1d,这意味着每次读取时只读取一个数字。

while循环会一直执行,直到scanf函数返回EOF(文件结束标志),这通常意味着输入流已经结束。累加的结果存储在变量sum中,最后通过printf函数输出。

代码 4 :

#include <stdio.h> /* 引入标准输入输出库,用于程序中的输入输出操作 */

int main(void) /* 主函数的开始,使用void表示不需要参数 */
{
    int n, i = 0, j, sum = 0; /* 声明整型变量n用于存储输入的数字,i作为数组索引,j用于for循环,sum用于存储数位之和 */
    int a[10]; /* 声明一个大小为10的整型数组a,用于存储分解的数位 */
    scanf("%d", &n); /* 从标准输入读取一个整数值到变量n */

    /* 使用while循环分解n,直到n小于10,即n只剩下一位数字 */
    while (n / 10 != 0)
    {
        a[i] = n % 10; /* 将n的最低位数字存储到数组a的第i个位置 */
        n = n / 10; /* 将n除以10,去掉最低位 */
        i++; /* 索引i递增 */
    }
    
    /* 使用for循环累加数组a中存储的数位到sum */
    for (j = 0; j < i; j++)
    {
        sum = sum + a[j]; /* 将数组a的第j个元素加到sum上 */
    }
    sum = sum + n; /* 将n的当前值(此时为最后一位数字)加到sum上 */
    printf("%d", sum); /* 打印出数位之和sum */

    return 0; /* 主函数返回0,表示程序正常结束 */
}

这段代码的目的是读取一个整数,然后计算这个整数各个数位上的数字之和。

它首先使用scanf从标准输入读取一个整数,然后通过while循环将这个整数分解成单个的数位,并将它们存储到数组a中。

随后,使用for循环累加数组中的数位到变量sum

最后,将剩余的数字(如果存在)加到sum中,并打印出结果。


知识点 : 

输入输出操作:使用 scanf 函数从标准输入读取数据,使用 printf 函数向标准输出打印结果。

循环控制:使用 while 循环和 for 循环来重复执行代码块,直到满足特定条件。

数组的使用:创建和使用数组来存储和操作数据。在本题中,数组用于存储整数的各个数位。

整数的数学操作

使用取模操作符 % 来获取一个整数的最低位数字。

使用整除操作 / 来移除整数的最低位数字。

变量的作用域和生命周期:理解在 main 函数中声明的变量在整个函数的执行过程中是可见和可用的。

条件判断:使用条件表达式 n / 10 != 0 来控制循环的执行,直到整数 n 只剩下个位数。

算术运算:执行加法和除法运算来分解和计算整数的数位之和。

数组索引:使用索引来访问数组中的元素,如 a[i] 表示访问数组 a 的第 i 个元素。

程序逻辑:设计算法逻辑来分解整数、存储数位、计算数位之和,并处理最后的输出。

代码结构:理解并实现程序的结构,包括初始化变量、执行循环、条件判断和输出结果。

整数除法的截断行为:在 C 语言中,整除操作会截断结果,即只保留整数部分。

函数的返回值:使用 return 语句从 main 函数返回一个值,通常用于表示程序的退出状态。

  


网站公告

今日签到

点亮在社区的每一天
去签到