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\n", x );
    }
    return 0;
}

你可能感兴趣的:(模拟,基本算法)