Понедельник, 29.04.2024, 15:48
"I-School" - школа знаний XXI века
     In doing we learn
Главная | Регистрация | Вход Приветствую Вас Гость | RSS
Форма входа
Категории раздела
Пользователь ПК [0]
WEB-дизайн [0]
Программирование [18]
Корзина
Пользователь ПК [0]
WEB-дизайн [0]
Программирование [18]
Поиск
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » Информатика, программирование » Программирование

    Одновременно десятичный и бинарный палиндром

    Задача решена на С++ в MS VS2013

    1. /*
    2. Палиндром - это такое число, которое читается одинаково слева направо и справа налево.
    3. Некоторые числа, являются палиндромами и в десятичной и в двоичной записях, например,
    4. 585 =1001001001. Найти сумму всех обладающих таким свойством палиндромов меньших 10 миллионов.
    5. */
    6. #include <iostream>
    7. #include <string>
    8. #include <algorithm> //    std::reverse
    9. bool IsPalindrom(std::string &);
    10. int ToDecimalNum(std::string &);
    11. //---------------------------------------------------------------------CLASS NUMBER
    12. class Number
    13. {
    14.     int decimal_num;
    15.     std::string decimal_string;
    16.     std::string binary_string;
    17.     
    18.     void ToBinaryString();
    19.     void ToDecimalString();
    20. public:
    21.     Number(int);
    22.     
    23.     int GetNum_10(){ return decimal_num; }
    24.     std::string GetStr_10(){ return decimal_string; }
    25.     std::string GetStr_2(){ return binary_string; }
    26.     void Print();
    27.     bool IsDoublePalindrom();
    28. };
    29. Number::Number(int _num)
    30. {
    31.     decimal_num = _num;
    32.     ToDecimalString();
    33.     ToBinaryString();
    34. }
    35. //преобразование десятичного числа в десятичную строку
    36. void Number::ToDecimalString()
    37. {
    38.     int current = decimal_num;
    39.     while (current)
    40.     {
    41.         decimal_string.push_back('0' + current % 10);
    42.         current /= 10;
    43.     }
    44.     std::reverse(decimal_string.begin(), decimal_string.end());
    45. }
    46. //преобразование десятичного числа в двоичную строку
    47. void Number::ToBinaryString()
    48. {
    49.     int current = decimal_num;
    50.     while (current)
    51.     {
    52.         binary_string.push_back('0' + current % 2);
    53.         current /= 2;
    54.     }
    55.     std::reverse(binary_string.begin(), binary_string.end());
    56. }
    57. //вывод на консоль десятичного и двоичного представлений
    58. void Number::Print()
    59. {
    60.     std::cout << decimal_string << "\t" << binary_string << "\n";
    61. }
    62. //проверка на двойной палиндром
    63. bool Number::IsDoublePalindrom()
    64. {
    65.     return IsPalindrom(decimal_string) && IsPalindrom(binary_string);
    66. }
    67. //-------------------------------------------------------------END CLASS NUMBER
    68. //---------------------------------------------проверка любой строки на палиндром
    69. bool IsPalindrom(std::string &s)
    70. {
    71.     int i = -1, j = s.length();
    72.     while (++i < --j)
    73.     {
    74.         if (s[i] != s[j])
    75.             return false;
    76.     }
    77.     return true;
    78. }
    79. //------------------------------------------десятичная строка в десятичное число
    80. int ToDecimalNum(std::string &decimal_str)
    81. {
    82.     int i = decimal_str.length();
    83.     if (i < 10)
    84.     {
    85.         int factor = 1;
    86.         int res = 0;
    87.         while (--i > -1)
    88.         {
    89.             res += (decimal_str[i] - '0')*factor;
    90.             factor *= 10;
    91.         }
    92.         return res;
    93.     }
    94.     return -1;
    95. }
    96. //----------------------------------------------------------решение задачи
    97. void DoublePalindroms(int upper_bound)
    98. {
    99.     int sum = 0;
    100.     //OPTIM_1 четное число не может быть двоичным палиндромом
    101.     //OPTIM_2 двойной палиндром не может начинаться на четное число
    102.     
    103.     for (int num = 1; num < upper_bound; num += 2)        //проверяем только нечетные числа
    104.     {
    105.         Number current(num);
    106.         std::string current_str = current.GetStr_10();
    107.         
    108.         //число начинается с нечетной цифры
    109.         if ((current_str[0] - '0') % 2)
    110.         {
    111.             if (current.IsDoublePalindrom())
    112.             {
    113.                 current.Print();
    114.                 sum += current.GetNum_10();
    115.             }
    116.         }
    117.         //число начинается с четной цифры
    118.         else
    119.         {
    120.             std::string jump = current_str;                    //например, 2001
    121.             for (int i = 1; i < jump.length(); i++)
    122.                 jump[i] = '9';
    123.             num = ToDecimalNum(jump);                        //перепрыгиваем на 2999
    124.         }
    125.     }
    126.     std::cout << "SUM = " << sum;
    127. }
    128. //--------------------------------------------------------------------MAIN
    129. int main()
    130. {
    131.     DoublePalindroms(10000000);
    132.     
    133.     std::cin.get();
    134.     return 0;
    135. }
    136. //--------------------------------------------------------------------------

    Результат:

    Категория: Программирование | Добавил: IrineK (06.07.2016)
    Просмотров: 940 | Теги: палиндром, бинарное число, десятичное число, c++ | Рейтинг: 0.0/0
    Всего комментариев: 0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]
    Copyright MyCorp © 2024
    Конструктор сайтов - uCoz