拆数

题目描述

小可刚学完循环语句,他已经掌握了如何将一个数字循环拆开,作为小可的同学,小可邀请你做一下这个题:

如果一个正整数的十进制数的每一位数字的和为 \(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;
} 
posted @ 2023-10-29 10:45  卡布叻-空白  阅读(88)  评论(0)    收藏  举报