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

题目链接

题目大意

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

题目思路

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

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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;
}

你可能感兴趣的:(思维)