Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // http://www.forum-invaders.com.br/vb/showthread.php/42844-DESAFIO-Pal%C3%ADndromo-Pamdigital
- #include <stdio.h>
- #include <math.h>
- #include <time.h>
- #include <windows.h>
- typedef unsigned char bin_t[20];
- typedef unsigned int dec_t;
- dec_t reverseDigits(dec_t num)
- {
- dec_t rev_num = 0;
- while(num > 0)
- {
- rev_num = rev_num * 10 + (num % 10);
- num = num * 0.1;
- }
- return rev_num;
- }
- dec_t nextPalindrome(dec_t n) {
- n++;
- int digits = 0;
- dec_t num = n;
- do {
- digits++;
- } while((num *= 0.1) > 0);
- if(digits == 1)
- return n;
- dec_t half = digits * 0.5;
- dec_t left = n * pow(0.1, half);
- dec_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);
- }
- dec_t p10h = pow(10, half);
- dec_t right = n - (left * p10h);
- if(digits % 2) {
- 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 isPalindromeBin(dec_t dec) {
- bin_t bin = {0};
- int digits = -1;
- int i = 0;
- do {
- bin[++digits] = dec % 2;
- } while((dec >>= 1) > 0);
- int half = digits / 2;
- for(i = 0; i <= half; ++i)
- if(bin[i] != bin[digits - i])
- return 0;
- return 1;
- }
- int main()
- {
- dec_t r = 0;
- dec_t v = 1;
- while(v <= 1000000) {
- if(isPalindromeBin(v))
- r += v;
- v = nextPalindrome(v);
- }
- printf("%d", r);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement