week2-[循环嵌套]数位和为m倍数的数

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
    1. 求它的数位和 digitSum(x)
    2. 判断 digitSum(x) % m == 0
    3. 如果成立,就保存 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 的倍数。
  • 格式控制:注意空格,只在输出第二个及之后的数时加空格。
相关推荐
夜思红尘2 小时前
算法--双指针
python·算法·剪枝
散峰而望3 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo3 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……3 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L3 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智者知已应修善业4 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied4 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0115 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
..过云雨5 小时前
17-2.【Linux系统编程】线程同步详解 - 条件变量的理解及应用
linux·c++·人工智能·后端
历程里程碑5 小时前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode