思路:
一位大佬的思路:https://blog.csdn.net/hzf0701/article/details/108414450
这里记录一下自己的理解:
找进位点,即记录s的前缀和小于n的最大位置pos(注意9的进位),
如果
p
o
s
=
=
−
1
pos==-1
pos==−1,也就是s[0]就不满足小于n这个条件的话,输出
1
0
s
i
z
e
o
f
(
s
)
+
1
10^{sizeof(s)+1}
10sizeof(s)+1
如果
p
o
s
!
=
−
1
pos!=-1
pos!=−1,那么就把pos位置的值+1,并把pos位置后的数变0
然后就是两个好用的字符串和数值转换的函数啦,
to_string():将数值转换为字符串
stoll():将字符串转换为long long数值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,s,t;
string str;
void solve() {
str = to_string(n);
int cnt=0,len=str.size(),pos=-1;
for(int i=0; i<len; i++) {
cnt+=(str[i]-'0');
if(str[i]=='9') continue;
if(cnt<s) pos=i;
}
if(cnt<=s) cout<<"0"<<endl;
else if(pos==-1) {
str="1";
for(int i=0;i<len;i++) str+="0";
cout<<(stoll(str)-n)<<endl;
}
else{
str[pos]++;
for(int i=pos+1;i<len;i++) str[i]='0';
cout<<(stoll(str)-n)<<endl;
}
}
int main() {
cin>>t;
while(t--) {
cin>>n>>s;
solve();
}
}