// 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