emm贪心的想,先把数字n从高位到低位的数位预处理出来
然后从高位看到低位(高位能不动就不动的原则),现在考虑如何构造最小的数b
设前i位数字和是sumn(前i位指的是高位到低位)
如果sumn<s,最后结果前i位肯定不需要变动
因为最坏情况后面数位都变成0,向自己进一位
sumn+1一定小于等于s,满足条件
一旦sumn>s,这一位一定要变动,但是不能变大(情况更糟),只能一直进位变成0
也就是从这一位开始的位数都变成0,并向前进一位(因为后面都是0)
那么如果sumn==s呢?和sumn>s的情况有啥不同吗?
可以说基本没有不同
只不过是说明后面都变成0自己不动可以满足条件sumn==s
扫描二维码关注公众号,回复:
11606799 查看本文章
但是由于只能执行加法的原因,自己不进位,后面数字都变成0(是减法)
所以和sumn>s的情况是一样的
如果后面的数位都等于0自己确实不需要变动,但是这种情况开头特判一下就好了
emm可能讲的比较啰嗦不清楚,一定在评论区提问啊看不懂的话!!
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
int a[22],b[22],s;
signed main()
{
int t,n; cin >> t;
while( t-- )
{
cin >> n >> s;
int len=0,x=n,sumn=0;
memset(a,0,sizeof(a)); memset(b,0,sizeof(b));
while( x )
a[++len]=x%10,sumn+=a[len],x/=10;
if( sumn==s )
{
cout << 0 << endl;
continue;
}
sumn=0;
for(int i=len;i>=1;i--)
{
sumn+=a[i];
if( sumn<s )
b[i]=a[i];
else if( sumn>=s )
{
b[i+1]++;
for(int j=i;j>=1;j-- ) b[j]=0;
break;
}
}
int now=0;
for(int j=1;j<=len;j++)
{
b[j+1]+=b[j]/10;
b[j]%=10;
}
now=b[len+1];
for(int i=len;i>=1;i--) now=now*10+b[i];
cout << now-n << endl;
}
}