HDU4608:I-number


クリックしてタイトルリンクを開く
I-number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1524    Accepted Submission(s): 612
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 10
5.
 
Output
Output the I-number of x for each query.
 
Sample Input

       
       
       
       
1 202

 
Sample Output

       
       
       
       
208

 
Source
2013 Multi-University Training Contest 1
 
Recommend
liuyiding
 
==================================================
#include <cstdio>
#include <cstring>
#include <numeric>

using namespace std;

const int kCarryReserve = 1; //     (    )。

int T;

char buffer[ 100005 ], *x;

int main()
{
    while( scanf( "%d", &T ) == 1 ) while( T-- )
    {
        memset( buffer, '0', kCarryReserve );
        scanf( "%s", x = buffer + kCarryReserve );
        char* last = x + strlen( x );
        
        while( true )
        {
            //   。
            char* p = last - 1;
            while( *p == '9' ) { *p-- = '0'; }
            ++*p;
            if( p < x ) { x = p; }
            
            //   。
            int sum = accumulate( x, last, '0' * ( x - last ) );
            if( sum % 10 == 0 ) { break; }
        }
        
        printf( "%s
", x ); } return 0; }