Advertisement
HwapX

Desafio Palíndromo Pamdigital

Nov 1st, 2015
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.97 KB | None | 0 0
  1. // http://www.forum-invaders.com.br/vb/showthread.php/42844-DESAFIO-Pal%C3%ADndromo-Pamdigital
  2.  
  3. #include <stdio.h>
  4. #include <math.h>
  5. #include <time.h>
  6. #include <windows.h>
  7.  
  8. typedef unsigned char bin_t[20];
  9. typedef unsigned int dec_t;
  10.  
  11. dec_t reverseDigits(dec_t num)
  12. {
  13.     dec_t rev_num = 0;
  14.     while(num > 0)
  15.     {
  16.         rev_num = rev_num * 10 + (num % 10);
  17.         num = num * 0.1;
  18.     }
  19.     return rev_num;
  20. }
  21.  
  22. dec_t nextPalindrome(dec_t n) {
  23.     n++;
  24.    
  25.     int digits = 0;
  26.     dec_t num = n;
  27.     do {
  28.         digits++;
  29.     } while((num *= 0.1) > 0);
  30.        
  31.     if(digits == 1)
  32.         return n;
  33.        
  34.     dec_t half = digits * 0.5;
  35.     dec_t left = n * pow(0.1, half);
  36.     dec_t r_left = reverseDigits(left);
  37.     if(r_left % 2 == 0) {
  38.         return nextPalindrome(((int)(n * pow(0.1, digits-1)) + 1) * pow(10, digits-1));
  39.         r_left = reverseDigits(left);
  40.     }
  41.     dec_t p10h  = pow(10, half);
  42.     dec_t right = n - (left * p10h);
  43.  
  44.     if(digits % 2) {
  45.         r_left = reverseDigits(left * 0.1);
  46.        
  47.         if(r_left > right)
  48.             return (left * p10h) + r_left;
  49.         else {
  50.             ++left;
  51.             return (left * p10h) + reverseDigits(left * 0.1);
  52.         }
  53.     } else {
  54.         if(r_left > right)
  55.             return (left * p10h) + r_left;
  56.         else {
  57.             ++left;
  58.             return (left * p10h) + reverseDigits(left);
  59.         }
  60.     }
  61. }
  62.  
  63. int isPalindromeBin(dec_t dec) {
  64.     bin_t bin = {0};
  65.     int digits = -1;
  66.     int i = 0;
  67.    
  68.     do {
  69.         bin[++digits] = dec % 2;
  70.     } while((dec >>= 1) > 0);
  71.    
  72.     int half = digits / 2;
  73.    
  74.     for(i = 0; i <= half; ++i)
  75.         if(bin[i] != bin[digits - i])
  76.             return 0;
  77.            
  78.     return 1;
  79. }
  80.  
  81. int main()
  82. {
  83.     dec_t r = 0;
  84.     dec_t v = 1;
  85.    
  86.     while(v <= 1000000) {
  87.         if(isPalindromeBin(v))
  88.             r += v;
  89.         v = nextPalindrome(v);
  90.     }
  91.  
  92.     printf("%d", r);
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement