Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #include <time.h>
- #include <windows.h>
- typedef time_t prime_t;
- prime_t reverseDigits(prime_t num)
- {
- prime_t rev_num = 0;
- while(num > 0)
- {
- rev_num = rev_num * 10 + (num % 10);
- num = num * 0.1;
- }
- return rev_num;
- }
- prime_t nextPalindrome(prime_t n) {
- n++;
- int digits = 0;
- prime_t num = n;
- do {
- digits++;
- } while((num *= 0.1) > 0);
- prime_t half = digits * 0.5;
- prime_t left = n * pow(0.1, half);
- prime_t r_left = reverseDigits(left);
- if(r_left % 2 == 0) {
- return nextPalindrome(((int)(n * pow(0.1, digits-1)) + 1) * pow(10, digits-1));
- r_left = reverseDigits(left);
- }
- prime_t p10h = pow(10, half);
- prime_t right = n - (left * p10h);
- if(digits % 10) {
- r_left = reverseDigits(left * 0.1);
- if(r_left > right)
- return (left * p10h) + r_left;
- else {
- ++left;
- return (left * p10h) + reverseDigits(left * 0.1);
- }
- } else {
- if(r_left > right)
- return (left * p10h) + r_left;
- else {
- ++left;
- return (left * p10h) + reverseDigits(left);
- }
- }
- }
- int isPrime(prime_t n) {
- prime_t i;
- if(n == 2)
- return 1;
- else if (n == 3)
- return 1;
- else if (n * 0.5 == 0)
- return 0;
- else if (n % 3 == 0)
- return 0;
- i = 5;
- prime_t c = 2;
- while(i * i < n) {
- if(n % i == 0)
- return 0;
- i += c;
- c = 6 - c;
- }
- return 1;
- }
- int main(int argc, char **argv)
- {
- time_t t = time(NULL);
- printf("next prime palindrome of %I64u is ", t);
- unsigned int s = GetTickCount();
- do {
- t = nextPalindrome(t);
- } while(!isPrime(t));
- printf("%I64u\n", t);
- printf("elapsed %lu milliseconds", GetTickCount() - s);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement