The I-number of x is defined to be an integer y, which satisfied the the conditions below:
1. y>x;
2. the sum of each digit of y(under base 10) is the multiple of 10;
3. among all integers that satisfy the two conditions above, y shouble be the minimum.
Given x, you're required to calculate the I-number of x.
1. y>x;
2. the sum of each digit of y(under base 10) is the multiple of 10;
3. among all integers that satisfy the two conditions above, y shouble be the minimum.
Given x, you're required to calculate the I-number of x.
The following T lines describe all the queries, each with a positive integer x. The length of x will not exceed 10 5.
1 202
208
题意:
找到大于给定值的一个数,这个数各位之和是10的倍数。
坑爹的地方:
10的5次方是数的长度不是数的大小,所以要用高精度来做,时间有5s,直接暴力跑就能过。
(刚开始打表用二分做的,没看到是数的长度而不是大小)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
void add(char a[],char b[],char c[])//a+b=c
{
int i,e,d;
int n,m;
char temp;
n=strlen(a);
m=strlen(b);
for(i=0; i<n/2; i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}//将a倒置,另外倒置可以写成另外的函数以便节省代码量,后面多次调用
for(i=0; i<m/2; i++)
{
temp=b[i];
b[i]=b[m-1-i];
b[m-1-i]=temp;
}//将b倒置
e=0;
for(i=0; i<n&&i<m; i++)
{
d=a[i]-'0'+b[i]-'0'+e;
e=d/10;
c[i]=d%10+'0';
}//进行模拟加法
if(i<m)
{
for(; i<m; i++)
{
d=b[i]-'0'+e;
e=d/10;
c[i]=d%10+'0';
}
}
else
{
for(; i<n; i++)
{
d=a[i]-'0'+e;
e=d/10;
c[i]=d%10+'0';
}
}//如果有一个数的位数较多,特殊处理
if(e) {c[i++]=e+'0';n++;m++;}//处理最后一位可以进位的情况
c[i]=0;
for(i=0; i<max(n,m)/2; i++)
{
temp=c[i];
c[i]=c[max(n,m)-1-i];
c[max(n,m)-1-i]=temp;
}//倒置
n=strlen(a);
m=strlen(b);
for(i=0; i<n/2; i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}//将a倒置
for(i=0; i<m/2; i++)
{
temp=b[i];
b[i]=b[m-1-i];
b[m-1-i]=temp;
}//将b倒置 //此处添加适用于循环的代码
}
void print(char c[])
{
int len=strlen(c);
if(c[0]=='0')
{for(int i=1;i<len;i++)
printf("%c",c[i]);
printf("\n");
}
else
puts(c);
}
char c[100050],c1[100050],ans3[100050],temp[100050];
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
memset(c,0,sizeof(c));
memset(ans3,0,sizeof(ans3));
memset(c1,0,sizeof(c1));
gets(c);
int len=strlen(c);
for(int i=0;i<len;i++)
if(i==len-1)
c1[i]='1';
else c1[i]='0';
//puts(c);
//456puts(c1);
while(1)
{
add(c,c1,ans3);
//puts(ans3);
int ans1=0;
for(int i=0;i<strlen(ans3);i++)
ans1+=ans3[i]-'0';
if(ans1%10==0)
{
puts(ans3);
break;
}
strcpy(c,ans3);
}
}
return 0;
}