题目链接:http://codeforces.com/problemset/problem/1060/B
 Time limit per test: 2 seconds Memory limit per test: 512 megabytes
Problem Description
You are given a positive integer n.
 Let S(x) be sum of digits in base 10 representation of xx, for example, S(123)=1+2+3=6, S(0)=0.
 Your task is to find two integers a,ba,b, such that 0≤a,b≤n, a+b=n and S(a)+S(b) is the largest possible among all such pairs.
Input
The only line of input contains an integer n (1≤n≤10^12)
Output
Print largest S(a)+S(b) among all pairs of integers a,b, such that 0≤a,b≤n and a+b=n.
Input
35
10000000000
Output
17
91
Note
In the first example, you can choose, for example, a=17 and b=18, so that S(17)+S(18)=1+7+1+8=17. It can be shown that it is impossible to get a larger answer.
In the second test example, you can choose, for example, a=5000000001 and b=4999999999, with S(5000000001)+S(4999999999)=91. It can be shown that it is impossible to get a larger answer.
Solving Ideas
将n分离成最高项和其余项两项,然后把最高项的减一,另一项加一,使其出现最多的9。
 例如:
 n=359=300+59=299+60, 则s(299)+s(60)=2+(3-1)*9+6+0=26;
 其中(3-1)指的是最高位后有多少个9.
 n=99=90+9=89+10, 则s(89)+s(10)=8+(2-1)*9+1+0=18;
 n=2568=2000+568=1999+569, 则s(1999)+s(569)=1+(4-1)*9+5+6+9=48。
 具体见代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
    char s[15];
    int ans, len, c, t;
    scanf("%d", &t);
    while (t--) {
        c = 1;
        ans = 0;
        scanf("%s", s);
        len = strlen(s);
        ans += s[0] - '0' + (len - 1) * 9 - 1;
        for (int i = len - 1; i > 0; i--) {
            s[i] += c;
            c = (s[i] - '0') / 10;
            s[i] = (s[i] - '0') % 10 + '0';
            ans += s[i] - '0';
        }
        printf("%d\n", ans + c);
    }
    return 0;
}
京公网安备 11010502036488号