【HDOJ】2451 Simple Addition Expression

递推,但是要注意细节。题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n。该表达中计算过程中CA恒为0(包括中间值)的情况。根据所求可推得。
1-10: 3
1-100: 3*4
1-1000: 3*4*4
1-10000: 3*4*4*4
1-10^n: 3*4^(n-1)。
并且需要注意,一旦发现某一位大于3,则应立即跳出累加的循环。比如,f(133) = 24,f(143) = 24。同时,单独讨论个位的情况。28行的break处理该种情况。

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 __int64 pre[11];
 5 char buf[15];
 6 
 7 int main() {
 8     int i, k, len;
 9     __int64 ans;
10 
11     pre[0] = 1;
12     pre[1] = 1;
13     for (i=2; i<11; ++i)
14         pre[i] = pre[i-1]<<2;
15 
16     while (scanf("%s", buf) != EOF) {
17         len = strlen(buf);
18         ans = 0;
19         for (i=0; i<len; ++i) {
20             k = buf[i] - '0';
21             if (i == len-1) {
22                 if (k > 3)
23                     ans += 3;
24                 else
25                     ans += k;
26             } else if (k > 3) {
27                 ans += pre[len-i]*3;
28                 break;
29             } else
30                 ans += k*pre[len-i-1]*3;
31         }
32         printf("%I64d\n", ans);
33     }
34 
35     return 0;
36 }

 

posted on 2014-08-12 00:31  Bombe  阅读(154)  评论(0编辑  收藏  举报

导航