测试样例
inputCopy
5
2 1
1 1
500 4
217871987498122 10
100000000000000001 1
输出
8
0
500
2128012501878
899999999999999999
题意:给你两个数a,b,每次使a+1,问:至少多少次使a每位数字的和小于等于b
思路:模拟一下数字的增加和每位数字的和的变化我们可以发现当最后一位数字增加时数字总和也在增加当最后一位数字变成零时,往前进一这时数字的总合可能变小,每位数字都是这样.所以我们只需要从后往前每次把数字变为零然后前面的数字进一再判断就可以了.
AC code
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<stack>
#include<queue>
#include<stdio.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long int a[30];
memset(a,0,sizeof(a));
long long int b,l=0,s=0,aa;
cin>>aa>>b;
long long int v=aa;
while(aa>0)//把数字存在数组里面
{
a[l++]=aa%10;
s+=aa%10;
aa/=10;
}
if(s<=b)printf("0\n");//总和小于等于b直接输出0
else
{
for(int i=0;i<l;i++)
{//从后往前开始判断
s-=a[i];//综合减去此数字
a[i]=0;//此数字归零
a[i+1]++;//后面的数字加一
if(a[i+1]>=10)//如果后面的数字此时大于零
{
int g=i;
while(a[g+1]>=10)//要用while,否则有可能后面的数大于等于10
//但此次循环之后s<b然后跳出来,后面的数没有进位输出就wrang
//了...
{
s-=9;//此位减10,后位加一,总数减9
a[g+1]-=10;
a[g+2]++;
if(g+1==l-1)l++;//总的位数增加
g++;
}
}
s++;
if(i+1==l)l++;
if(s<=b)break;//判断
}
long long int ss=0,d=1;
for( long long int i=0;i<l;i++)
{
ss+=d*a[i];
d*=10;
}
printf("%lld\n",ss-v);
}
}
}