拆数
题目描述
小可刚学完循环语句,他已经掌握了如何将一个数字循环拆开,作为小可的同学,小可邀请你做一下这个题:
如果一个正整数的十进制数的每一位数字的和为 \(sum\),如果 \(sum\) 能被 \(k\) 整除 则称 \(sum\) 是 \(k\) 的 “拆数” 。现在给定两个整数 \(x\) 和 \(k\) ,请找出最小的 \(y\),使得 \(x≤y\) 并且 \(y\) 是 \(k\) 的拆数。
题目思路
首先,计算给定正整数 \(x\) 的各个位数的和 \(sum\),初始化变量 \(y\) 为 \(x\),表示我们要寻找的满足条件的最小拆数。
使用循环,从 \(0\) 到 $9 $ 遍历数字 \(d\)。
- 对于每个 \(d\),我们检查 \((sum + d) \mod k\) 是否等于 \(0\),即是否满足将 \(d\) 加上 \(sum\) 后能被 \(k\) 整除。
- 如果满足这个条件,我们将 \(d\) 添加到 \(y\) 的最低位,即通过将 \(y\) 乘以 \(10\) 并加上 \(d\) 来实现。
- 更新 \(sum\) 为 \((sum + d) / 10\),即将 $ sum$ 更新为去除最低位的值。
- 如果 \(sum\) 变为 \(0\),说明我们已经找到了满足条件的拆数,可以终止循环。
最后,\(y\) 就是满足条件的最小拆数。
代码实现
#include <iostream>
#define int long long
using namespace std;
int sovle(int num) { // 拆数(基础知识罢
int sum = 0;
while(num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
int fun(int x,int k) {
int y = x;
while(1) {
int sum = sovle(y); // 把 y 大卸八块
if(sum % k == 0) return y; // 判断是否可行,可行就 return ta
y++; // 不可行,下一个
}
}
signed main() {
int t;
cin >> t;
while(t--) { // t 组数据
int x,k;
cin >> x >> k;
cout << fun(x,k) << endl;
}
return 0;
}

浙公网安备 33010602011771号