week2-[循环嵌套]数位和为m倍数的数
题目描述
给定三个正整数 l,r,ml,r,ml,r,m,请求出 lll 到 rrr 之间有哪些数满足数位和为 mmm 的倍数。一个数的数位和定义为它的各个数码相加之和,如 523155231552315 的数位和为 5+2+3+1+5=165 + 2 + 3 + 1 + 5=165+2+3+1+5=16。
输入格式
输入只有 111 行,该行包括 333 个正整数 l,rl,rl,r 和 mmm。
输出格式
输出 111 行,按从小到大的顺序将 lll 到 rrr 之间和为 mmm 倍数的数输出,每两个数字之间用恰好一个空格隔开。 如果 lll 到 rrr 之间不存在和为 mmm 倍数的数,则输出一个整数 −1-1−1。
样例 #1
样例输入 #1
6 20 9
样例输出 #1
9 18
样例 #2
样例输入 #2
7 15 2
样例输出 #2
8 11 13 15
样例 #3
样例输入 #3
9 200 20
样例输出 #3
-1
提示
样例解释1
666 到 202020 之间:
999 的数位和为 999,为 999 的倍数。
181818 的数位和为 1+8=91+8=91+8=9,为 999 的倍数。
样例解释2
777 到 151515 之间:
888 的数位和为 888,为 222 的倍数。
111111 的数位和为 1+1=21+1=21+1=2,为 222 的倍数。
131313 的数位和为 1+3=41+3=41+3=4,为 222 的倍数。
151515 的数位和为 1+5=61+5=61+5=6,为 222 的倍数。
样例解释3
999 到 200200200 之间不存在和为 202020 倍数的数。
数据范围
对于所有数据,1≤l,r≤1000000000,0≤r−l≤10000,2≤m≤301 \le l, r \le 1000000000, 0 \le r - l \le 10000,2 \le m \le 301≤l,r≤1000000000,0≤r−l≤10000,2≤m≤30。
1. 阅读题目
- 输入:三个正整数 l,r,ml, r, ml,r,m。
- 输出:所有在区间 [l,r][l, r][l,r] 内,数位和是 mmm 的倍数的整数。
- 如果没有符合条件的数,输出
-1
。 - 注意:
- r−l≤10000r - l \leq 10000r−l≤10000,所以最多检查 10001 个数,完全可以暴力。
- 数位和计算方式:把数拆成个位、十位、百位......相加。
2. 分析问题
- 遍历区间
[l, r]
,对每个数x
:- 求它的数位和
digitSum(x)
。 - 判断
digitSum(x) % m == 0
。 - 如果成立,就保存
x
。
- 求它的数位和
- 最后:
- 如果至少有一个数 → 按顺序输出,中间空格隔开。
- 如果没有 → 输出
-1
。
重点:数位和的计算
int digitSum(int x) {
int sum = 0;
while (x > 0) {
sum += x % 10;
x /= 10;
}
return sum;
}
3. C++ 代码实现
c++
#include <iostream>
using namespace std;
int digitSum(int x) {
int sum = 0;
while (x > 0) {
sum += x % 10;
x /= 10;
}
return sum;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int l, r, m;
cin >> l >> r >> m;
bool found = false;
for (int i = l; i <= r; i++) {
if (digitSum(i) % m == 0) {
if (found) cout << " ";
cout << i;
found = true;
}
}
if (!found) cout << -1;
cout << "\n";
return 0;
}
✅ 总结
- 用循环枚举区间
[l, r]
。 - 嵌套循环(或 while)计算数位和。
- 逐个判断是否是 mmm 的倍数。
- 格式控制:注意空格,只在输出第二个及之后的数时加空格。