Codeforces Round #667 (Div. 3) D. Decrease the Sum of Digits 题解(思维)

题目链接

题目大意

就是给你一个正整数n看你加多少使得数位和少于s

题目思路

原来这么简单,直接模拟进位即可。

代码

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=5e5+5,inf=0x3f3f3f3f,mod=1e9;
char s[20];
int sumdig,cnt[100];
signed main(){
    int _;scanf("%d",&_);
    while(_--){
        memset(cnt,0,sizeof(cnt));
        scanf("%s %d",s+1,&sumdig);
        int d=strlen(s+1),nowdig=0;
        ll last=0;
        for(int i=1;i<=d;i++){
            cnt[i]=s[i]-'0';
            nowdig+=cnt[i];
            last=last*10+cnt[i];
        }
        reverse(cnt+1,cnt+1+d);//注意reverse
        for(int i=1;i<=d;i++){
            if(nowdig<=sumdig) break;
            if(cnt[i]==0) continue;
            nowdig-=cnt[i];
            cnt[i]=0;
            for(int j=i+1;;j++){
                if(cnt[j]==9){
                    nowdig-=cnt[j];
                    cnt[j]=0;
                }else{
                    cnt[j]++;
                    nowdig++;
                    break;
                }
            }
        }
        ll ans=0;
        reverse(cnt+1,cnt+1+d+1);
        for(int i=1;i<=d+1;i++){//最多进一位
            ans=ans*10+cnt[i];
        }
        printf("%lld\n",ans-last);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46209312/article/details/108416155