题目链接
题目描述
给定一个整数 n
,请计算它的所有数位之和。如果 n
是负数,应先取其绝对值再进行计算。
输入描述:
输入一个整数 n
,其范围在 [-10^9, 10^9]
之间。
输出描述:
输出一个整数,表示 n
的所有数位之和。
解题思路
本题要求我们将一个整数的每一位拆开并相加。解决这个问题的经典方法是循环利用取模 (%
) 和 整除 (/
) 运算。
-
处理负数: 题中明确指出,如果输入是负数,需要先取其绝对值。所以第一步就是对输入的
n
调用绝对值函数(如 C++ 的abs()
,Java 的Math.abs()
等)。 -
核心循环 (模除法): 我们使用一个
while
循环来处理这个(可能已经是正数的)n
,循环的条件是n > 0
。- 取个位数:
n % 10
这个表达式可以得到n
除以 10 的余数,这正好就是n
的个位数字。我们将这个数字累加到一个sum
变量中。 - 移除个位数:
n = n / 10
这个表达式(在整数运算中)会去掉n
的个位数。例如,如果n
是 123,123 / 10
结果是 12。
- 取个位数:
-
算法演示: 假设输入
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
的大小无关。