
题意:
你得到了一个正整数n。在一次移动中,你可以使n增加1(即使n:=n+1)。你的任务是找出为了使n的数位之和小于或等于s,你需要执行的最小移动数。
你必须回答t个独立的测试案例。
输入
输入的第一行包含一个整数t(1≤t≤2⋅104)--测试案例的数量。接着是t个测试用例。
测试用例的唯一一行包含两个整数n和s(1≤n≤1018;1≤s≤162)。
输出
对于每个测试用例,打印答案:为了使n的数位之和小于或等于s,你需要执行的最小移动数。
例子
输入
5
2 1
1 1
500 4
217871987498122 10
100000000000000001 1
输出
8
0
500
2128012501878
899999999999999999
题解:
题意很明确,模拟即可
但是看到大佬的代码发现还能这样写,极其简洁
我们直接从末尾开始枚举,先让n + 当前的数位
1~9 10
10 ~99 100
.... b
然后减n%(b)的数
看符不符合条件即可
- #include<iostream>
- #include<algorithm>
- #include<map>
- #include<queue>
- #include<vector>
- #include<cstring>
- using namespace std;
- long long check(long long x)
- {
- long long s = 0;
- while(x)
- {
- s += x%10;
- x = x/10;
- }
- return s;
- }
- void solve()
- {
- long long n,m;
- cin >> n >>m;
- long long k = n;
- long long b = 10;
- while(check(n)>m)
- {
- n +=b - n%b;
- b = b*10;
- }
- cout<<n-k<<"\n";
- }
- int main()
- {
- int t = 1;
- cin >> t;
- while(t--)
- {
- solve();
- }
- }
- //
- //