题目描述
给定一个数X,注意X是个大数,X的长度不超过1e5。
让你求出一个Y,满足三个条件,Y>X && (Y这个数的每一个数字总和)%10==0 还有就是满足以上两个条件最小的。
输入
在输入的第一行中存在整数T(T<=100),指示测试用例的数目。
下面的T行描述所有查询,每个查询都有正整数x。x的长度不超过1e5。输出
为每组数据输出满足条件的那个数。
样例输入
1 202样例输出
208
思路:
就是一个正数的大数加法问题,其中Y需要满足的条件:
1、Y>X-----------(从X开始往上加,找Y)
2、sum(Y这个数的每一个数字总和)%10==0 还有就是满足以上两个条件最小的--------
从X加1到X加10之间找,即10为一个周期,在这之间一定能找到sum%10==0的数
代码:
#include<stdio.h>//大数加法
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5+7;
#define Max(a,b) a>b?a:b
char str1[maxn],str2[10];
int a[maxn],b[maxn];
void strv(char str[],int a[],int n)//用数组逆序存储
{
for(int i=0,j=n-1;i<n;i++,j--)
{
a[j]=str[i]-'0';
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str1);
int y=strlen(str1);
if(y==1)
printf("19\n");
else
{
for(int i=1;i<=10;i++)//从1加到10,在这之间一定有一个数使Y%10==0
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int n1=strlen(str1);
int n2;
if(i<10)
{
n2=1;
b[0]=i;
}
else
{
n2=2;
b[0]=0;
b[1]=1;
}
strv(str1,a,n1);
int j,w;
int k=Max(n1,n2);
for(j=0,w=0;j<k;j++)
{
a[j]=a[j]+b[j]+w;
w=a[j]/10;
a[j]%=10;
}
if(w)
a[k]+=w;
int sum=0;
for(int i=k;i>=0;i--)//计算相加后每一位数字之和
{
sum+=a[i];
}
if(sum%10==0)
{
for(int i=k;i>=0;i--)//相加后的和,可能比最大的数还要多一位
{
if(i==k&&a[k]==0)
continue;
printf("%d",a[i]);
}
printf("\n");
break;
}
}
}
}
return 0;
}