// UVa 10533 - Digit Primes
#include <stdio.h>
#include <string.h>
#define LIMIT 1000000
int digit_prime_count_up_to[LIMIT + 1];
bool is_prime[LIMIT + 1];
void generate_primes() {
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = false;
is_prime[1] = false;
for (int j = 4; j <= LIMIT; j += 2)
is_prime[j] = false;
for (int i = 3; i <= 1000; i++)
if (is_prime[i]) {
for (int j = i * i; j <= LIMIT; j += i)
is_prime[j] = false;
}
}
void generate_digit_prime_numbers() {
digit_prime_count_up_to[0] = 0;
digit_prime_count_up_to[1] = 0;
for (int i = 2; i <= LIMIT; i++) {
digit_prime_count_up_to[i] = digit_prime_count_up_to[i - 1];
if (is_prime[i]) {
int digit_sum = 0;
for (int j = i; j; j /= 10) {
digit_sum += j % 10;
}
if (is_prime[digit_sum])
digit_prime_count_up_to[i]++;
}
}
}
int main() {
generate_primes();
generate_digit_prime_numbers();
int cases;
for (scanf("%d", &cases); cases; cases--) {
int start, end;
scanf("%d%d", &start, &end);
printf("%d\n", digit_prime_count_up_to[end] - digit_prime_count_up_to[start - 1]);
}
return 0;
}
Thursday, April 23, 2015
UVa 10533 - Digit Primes
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment