原题链接
开始总以为这题和排列组合有关,然后想了两节课也理不出思路,后来看到会长的这个方法,果断采用了。
感觉题目叙述的略坑。
| 794046 | 长木 | 关于521 | Accepted |
116 | 8044 | C/C++ | 04-03 08:23:16 |
#include#include #define MAX 1000000 + 2 int anger[MAX], anger2[MAX]; char str[10]; void intToString(int n){ int i = 0, t; while(n){ str[i++] = n % 10 + '0'; n /= 10; } str[i] = '\0'; //注意是倒置的 } int strCmp(){ if(strstr(str, "125")) return 2; if(strchr(str, '1') && strchr(str, '2' ) && strchr(str, '5')) return 1; return 0; } int main(){ int i, j = 1, t; for(i = 125; i != MAX; ++i){ intToString(i); t = strCmp(); switch(t){ case 1: anger[i] = anger[i - 1] + 1; anger2[i] = anger2[i - 1]; break; case 2: anger[i] = anger[i - 1] + 1; anger2[i] = anger2[i - 1] + 1; break; default : anger[i] = anger[i - 1]; anger2[i] = anger2[i - 1]; break; } } while(scanf("%d%d", &i, &t) == 2) printf("Case %d:%d %d\n", j++, anger[t] - anger[i - 1], anger2[t] - anger2[i - 1]); return 0; }
Accepted