原题链接
开始总以为这题和排列组合有关,然后想了两节课也理不出思路,后来看到会长的这个方法,果断采用了。
感觉题目叙述的略坑。
794046 | 长木 | 关于521 | Accepted | 116 | 8044 | C/C++ | 04-03 08:23:16 |
#include <cstdio>
#include <cstring>
#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;
}