#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int main()
{
int N;
int A,B;
int num=1;
int t[20];
cin>>N>>A>>B;
int M=N;
while(N/10!=0){ //计算出N是num位数字
N=N/10;
num++;
}
N=M;
for(int i=num;i>0;i--)
{
int d=pow(10,i);
if(i!=1)
{
t[i]= N % d / (pow(10,i-1));
} //从最高位到最低位,依次确定数字
else
{t[i]=N%10;}
if(t[i]<B)
{
B=B-(t[i]+1);
t[i]=9;
}
else
while(A>0 && t[i]<9)
{
t[i]=t[i]+1;
A=A-1;
}
cout<<t[i];
}
return 0;
}
上面代码逻辑是没有问题的,但是要注意N的值在10的十七次方,当C++超过int运行的范围后,编译的程序就存在错误.所以当表示数值很大的时候,建议采用字符串的方式定义.
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
char c[20];
LL ans=0;
//n:1号操作剩余次数 m:2号操作剩余次数
int n,m;
void dfs(int i,LL v){
int x=c[i]-'0';
if(c[i]){
//应该使用的操作次数
int t=min(n,9-x);
n-=t;
dfs(i+1,v*10+x+t);
//回溯
n+=t;
//考虑操作2是否能够使用
if(m>x){
m-=x+1;
dfs(i+1,v*10+9);
//回溯
m+=x+1;
}
}else{
//答案取max
ans=max(ans,v);
}
}
int main()
{
scanf("%s%d%d",c,&n,&m);
dfs(0,0);
printf("%lld\n",ans);
return 0;
}