题目链接

数位之和

题目描述

给定一个整数 n,请计算它的所有数位之和。如果 n 是负数,应先取其绝对值再进行计算。

输入描述: 输入一个整数 n,其范围在 [-10^9, 10^9] 之间。

输出描述: 输出一个整数,表示 n 的所有数位之和。

解题思路

本题要求我们将一个整数的每一位拆开并相加。解决这个问题的经典方法是循环利用取模 (%)整除 (/) 运算。

  1. 处理负数: 题中明确指出,如果输入是负数,需要先取其绝对值。所以第一步就是对输入的 n 调用绝对值函数(如 C++ 的 abs(),Java 的 Math.abs() 等)。

  2. 核心循环 (模除法): 我们使用一个 while 循环来处理这个(可能已经是正数的)n,循环的条件是 n > 0

    • 取个位数: n % 10 这个表达式可以得到 n 除以 10 的余数,这正好就是 n 的个位数字。我们将这个数字累加到一个 sum 变量中。
    • 移除个位数: n = n / 10 这个表达式(在整数运算中)会去掉 n 的个位数。例如,如果 n 是 123,123 / 10 结果是 12。
  3. 算法演示: 假设输入 n = -305

    • 第一步: 取绝对值,n 变为 305。初始化 sum = 0
    • 循环开始 (n=305):
      • digit = 305 % 10 得到 5
      • sum = 0 + 5 = 5
      • n = 305 / 10 得到 30
    • 下一次循环 (n=30):
      • digit = 30 % 10 得到 0
      • sum = 5 + 0 = 5
      • n = 30 / 10 得到 3
    • 再下一次循环 (n=3):
      • digit = 3 % 10 得到 3
      • sum = 5 + 3 = 8
      • n = 3 / 10 得到 0
    • 循环结束: 此时 n 变为 0,循环终止。返回 sum 的值 8

这种方法巧妙地将一个数字逐位分解,适用于各种进制的数位操作。

代码

#include <iostream>
#include <cmath> // 为了使用 abs()

using namespace std;

int main() {
    int n;
    cin >> n;
    
    // 首先取绝对值
    int num = abs(n);
    
    int sum = 0;
    
    // 如果数字是0,和就是0
    if (num == 0) {
        cout << 0 << endl;
        return 0;
    }
    
    while (num > 0) {
        sum += num % 10; // 取出个位数并加到sum中
        num /= 10;       // 移除个位数
    }
    
    cout << sum << endl;
    
    return 0;
}
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        // 首先取绝对值
        int num = Math.abs(n);
        
        int sum = 0;
        
        while (num > 0) {
            sum += num % 10; // 取出个位数
            num /= 10;       // 移除个位数
        }
        
        // 如果输入是0,循环不执行,sum为0,也是正确结果
        System.out.println(sum);
    }
}
n = int(input())

# 首先取绝对值
num = abs(n)

# # 纯数学解法
# total_sum = 0
# while num > 0:
#     total_sum += num % 10
#     num //= 10
# print(total_sum)

# Python 中更简洁的字符串解法
# 将数字转为字符串,遍历每个字符,转回整数后求和
total_sum = sum(int(digit) for digit in str(num))
print(total_sum)

算法及复杂度

  • 算法:循环取模与整除法。
  • 时间复杂度:。循环的次数等于整数 n 的十进制位数。一个数 n 的位数大约是 log10(n),所以这是一个非常高效的操作。
  • 空间复杂度:。我们只使用了固定的几个变量来存储数字和累加和,与 n 的大小无关。