题目地址
疑问
关于打表的疑问,如果我不打表,而是直接判断,会TE,如果打表了,则AC,
问题是我打表和直接判断采用的算法都是一样的,换言之我打表至少需要算1000000个数(0-999999),直接算的话至多也就是算1000000个数。
(疑问的解答):想通了,输入不止一组数据,所以打表只需要算一次,不打表就要输入一组数据算一次,所以会TE。
两份打表AC代码
通过sum数组直接相减,但是需要判断临界点,因为减得时候没包括n这个数也减去了
#include <cstdio>
int sum[1000005] = {0};
bool is_four(int n) {
while(n != 0) {
int t = n % 10;
if(t == 4) return true;
n /= 10;
}
return false;
}
bool is_sixXtwo(int n) {
while(n != 0) {
int t = n % 100;
if(t == 62) return true;
n /= 10;
}
return false;
}
int main() {
sum[0] = 1;
for(int i = 1; i < 1000005; i++) {
if(!is_four(i) && !is_sixXtwo(i)) {
sum[i] = sum[i - 1] + 1;
//printf("%d\n", sum[i]);
continue;
}
sum[i] = sum[i - 1];
}
int n, m;
while(scanf("%d %d", &n, &m) != EOF && (n || m)) {
if(!is_four(n) && !is_sixXtwo(n)) {
printf("%d\n", sum[m] - sum[n] + 1);
continue;
}
printf("%d\n", sum[m] - sum[n]);
}
return 0;
}
通过bool数组相加
#include <cstdio>
bool num[1000005] = {0};
bool is_four(int n) {
while(n != 0) {
int t = n % 10;
if(t == 4) return true;
n /= 10;
}
return false;
}
bool is_sixXtwo(int n) {
while(n != 0) {
int t = n % 100;
if(t == 62) return true;
n /= 10;
}
return false;
}
int main() {
for(int i = 1; i < 1000005 ; i++) {
if(!is_four(i) && !is_sixXtwo(i)) {
num[i] = 1;
}
}
int n, m;
while(scanf("%d %d", &n, &m) != EOF && (n || m)) {
int sum = 0;
for(int i = n; i <= m; i++) {
sum += num[i];
}
printf("%d\n", sum);
}
}