题意:
你得到了一个正整数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();
}
}
//
//