hdu 4608 I

来源:互联网 发布:路由器怎么设置网络快 编辑:程序博客网 时间:2024/06/06 08:57

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.
Input
An integer T(T≤100) will exist in the first line of input, indicating the number of test cases. 
The following T lines describe all the queries, each with a positive integer x. The length of x will not exceed 10 5
Output
Output the I-number of x for each query.
Sample Input
1202
Sample Output
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;}



0 0