题解P9215

· · 题解

题意

给出 x ,要求你构造出一个长度不超过 x 的整数 y ,使计算 x+y 时出现 k 个进位。

核心思路

因为 0 不能进位,其它数字可以。所以,我们可以把 x 末尾的 0 删掉,并统计个数,放在变量 a 个 中,继续。

删掉 0 之后,如果位数 <k ,就输出 -1

否则,建立 s 字符串,如果 x 包含非零数个数 <k ,将非零数在 s 字符串中对应位设 9 ,否则设 0 ,每设一个 9k1

接下来,在非零数之前的 0 ,因进位变成了 1 ,将对应位设 9 ,又产生进位,同时如果它前面有 0 ,那个 0 变成了 1 ,加 9 又会进位。所以,将后 k0 对应位变成 9 ,就可以了。

如果 x 包含非零书个数 \ge k ,将前 k 个非零数在 s 字符串中对应位设 9 ,否则设 0

最后,对于没有输出 -1 的情况下,输出 a0 ,一组数据处理完成。

代码

#include<bits/stdc++.h>
using namespace std;
int t,k,a;string x,s;
void doit(){
    s="";a=0;
    while(x[x.size()-1]=='0'){
        x.erase(x.size()-1);++a;
    }
    if(x.size()<k){
        puts("-1");return;
    }
    for(int i=0;i<x.size();++i)if(x[i]=='0'||!k)s+='0';else{
        s+='9';--k;
    }
    for(int i=x.size()-1;i>=0;--i)if(x[i]=='0'&&k){
        s[i]='9';--k;
    }
    cout<<s;
    for(int i=1;i<=a;++i)putchar('0');puts("");
}
int main(){
    scanf("%d",&t);
    while(t--){
        cin>>x>>k;
        doit();
    }
}