题意:
给你一个x,让你构造一个y,y的要求:
- y>x
- y的各项之和为10的倍数
- 在满足前两个的前提下,y尽可能小
题解:
模拟,尽可能的模拟,用字符串模拟
先将各位相加得到sum,然后看sum与最近的10的倍数的距离w,然后加上w得到sum1,然后看sum1是否是10的倍数,如果是输出,如果不是再重复一遍上面的步骤,一定就能得到:
举例:
90—>91
99---->100---->108
注意y>x,y不能等于x
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
char x[1000000];
int main()
{int t;cin>>t;while(t--){memset(x,0,sizeof(x));scanf("%s",x);int w;int sum=0;for(int i=0;i<strlen(x);i++){sum+=(x[i]-'0');}int q=x[strlen(x)-1]-'0';w=10-sum%10;int op=0;if(q+w>=10){x[strlen(x)-1]='0'; w=1;for(int i=strlen(x)-2;i>=0;i--){int ww=x[i]-'0'+w;x[i]=(char)((x[i]-'0'+w)%10+'0');if(ww>=10)w=1;else w=0;}if(w==1){int len=strlen(x);for(int i=0;i<len;i++){x[i+1]=x[i];}x[0]='1';}}else {x[strlen(x)-1]=(char)((x[strlen(x)-1]-'0'+w)%10+'0');}sum=0;for(int i=0;i<strlen(x);i++){sum+=(x[i]-'0');}if(sum%10==0){cout<<x<<endl;continue;}q=x[strlen(x)-1]-'0';w=10-sum%10;op=0;if(q+w>=10){x[strlen(x)-1]='0'; w=1;for(int i=strlen(x)-2;i>=0;i--){int ww=x[i]-'0'+w;x[i]=(char)((x[i]-'0'+w)%10+'0');if(ww>=10)w=1;else w=0;}if(w==1){int len=strlen(x);for(int i=0;i<len;i++){x[i+1]=x[i];}x[0]='1';}}else {x[strlen(x)-1]=(char)((x[strlen(x)-1]-'0'+w)%10+'0');}cout<<x<<endl;}return 0;
}