hdu4608_I-number_高精度+暴力

来源:互联网 发布:tc编程案例 编辑:程序博客网 时间:2024/05/21 22:57

I-number

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4215    Accepted Submission(s): 1487


Problem Description
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 105.
 

Output
Output the I-number of x for each query.
 

Sample Input
1202
 

Sample Output
208

题意:给你t组数,输出每组数对应符合下列要求的数:1.这个数比给的数大; 2.这个数各位加起来为10的倍数;3.这个数尽可能的小;

解:

一看数的长度不超过100000呢,普通的做法肯定不行咯,就用高精度,用char来存数,再暴力往上加1就行了,最多进行10次操作,不会太费时间。

代码:

#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
原创粉丝点击