Задача решена на С++ в MS VS2013
- #include <iostream>
- #include <string>
- #include <algorithm>
- bool IsPalindrom(std::string &);
- int ToDecimalNum(std::string &);
- class Number
- {
- int decimal_num;
- std::string decimal_string;
- std::string binary_string;
-
- void ToBinaryString();
- void ToDecimalString();
- public:
- Number(int);
-
- int GetNum_10(){ return decimal_num; }
- std::string GetStr_10(){ return decimal_string; }
- std::string GetStr_2(){ return binary_string; }
- void Print();
- bool IsDoublePalindrom();
- };
- Number::Number(int _num)
- {
- decimal_num = _num;
- ToDecimalString();
- ToBinaryString();
- }
- void Number::ToDecimalString()
- {
- int current = decimal_num;
- while (current)
- {
- decimal_string.push_back('0' + current % 10);
- current /= 10;
- }
- std::reverse(decimal_string.begin(), decimal_string.end());
- }
- void Number::ToBinaryString()
- {
- int current = decimal_num;
- while (current)
- {
- binary_string.push_back('0' + current % 2);
- current /= 2;
- }
- std::reverse(binary_string.begin(), binary_string.end());
- }
- void Number::Print()
- {
- std::cout << decimal_string << "\t" << binary_string << "\n";
- }
- bool Number::IsDoublePalindrom()
- {
- return IsPalindrom(decimal_string) && IsPalindrom(binary_string);
- }
- bool IsPalindrom(std::string &s)
- {
- int i = -1, j = s.length();
- while (++i < --j)
- {
- if (s[i] != s[j])
- return false;
- }
- return true;
- }
- int ToDecimalNum(std::string &decimal_str)
- {
- int i = decimal_str.length();
- if (i < 10)
- {
- int factor = 1;
- int res = 0;
- while (--i > -1)
- {
- res += (decimal_str[i] - '0')*factor;
- factor *= 10;
- }
- return res;
- }
- return -1;
- }
- void DoublePalindroms(int upper_bound)
- {
- int sum = 0;
-
-
-
- for (int num = 1; num < upper_bound; num += 2)
- {
- Number current(num);
- std::string current_str = current.GetStr_10();
-
-
- if ((current_str[0] - '0') % 2)
- {
- if (current.IsDoublePalindrom())
- {
- current.Print();
- sum += current.GetNum_10();
- }
- }
-
- else
- {
- std::string jump = current_str;
- for (int i = 1; i < jump.length(); i++)
- jump[i] = '9';
- num = ToDecimalNum(jump);
- }
- }
- std::cout << "SUM = " << sum;
- }
- int main()
- {
- DoublePalindroms(10000000);
-
- std::cin.get();
- return 0;
- }
/*
Палиндром - это такое число, которое читается одинаково слева направо и справа налево.
Некоторые числа, являются палиндромами и в десятичной и в двоичной записях, например,
585 =1001001001. Найти сумму всех обладающих таким свойством палиндромов меньших 10 миллионов.
*/
#include <iostream>
#include <string>
#include <algorithm> // std::reverse
bool IsPalindrom(std::string &);
int ToDecimalNum(std::string &);
//---------------------------------------------------------------------CLASS NUMBER
class Number
{
int decimal_num;
std::string decimal_string;
std::string binary_string;
void ToBinaryString();
void ToDecimalString();
public:
Number(int);
int GetNum_10(){ return decimal_num; }
std::string GetStr_10(){ return decimal_string; }
std::string GetStr_2(){ return binary_string; }
void Print();
bool IsDoublePalindrom();
};
Number::Number(int _num)
{
decimal_num = _num;
ToDecimalString();
ToBinaryString();
}
//преобразование десятичного числа в десятичную строку
void Number::ToDecimalString()
{
int current = decimal_num;
while (current)
{
decimal_string.push_back('0' + current % 10);
current /= 10;
}
std::reverse(decimal_string.begin(), decimal_string.end());
}
//преобразование десятичного числа в двоичную строку
void Number::ToBinaryString()
{
int current = decimal_num;
while (current)
{
binary_string.push_back('0' + current % 2);
current /= 2;
}
std::reverse(binary_string.begin(), binary_string.end());
}
//вывод на консоль десятичного и двоичного представлений
void Number::Print()
{
std::cout << decimal_string << "\t" << binary_string << "\n";
}
//проверка на двойной палиндром
bool Number::IsDoublePalindrom()
{
return IsPalindrom(decimal_string) && IsPalindrom(binary_string);
}
//-------------------------------------------------------------END CLASS NUMBER
//---------------------------------------------проверка любой строки на палиндром
bool IsPalindrom(std::string &s)
{
int i = -1, j = s.length();
while (++i < --j)
{
if (s[i] != s[j])
return false;
}
return true;
}
//------------------------------------------десятичная строка в десятичное число
int ToDecimalNum(std::string &decimal_str)
{
int i = decimal_str.length();
if (i < 10)
{
int factor = 1;
int res = 0;
while (--i > -1)
{
res += (decimal_str[i] - '0')*factor;
factor *= 10;
}
return res;
}
return -1;
}
//----------------------------------------------------------решение задачи
void DoublePalindroms(int upper_bound)
{
int sum = 0;
//OPTIM_1 четное число не может быть двоичным палиндромом
//OPTIM_2 двойной палиндром не может начинаться на четное число
for (int num = 1; num < upper_bound; num += 2) //проверяем только нечетные числа
{
Number current(num);
std::string current_str = current.GetStr_10();
//число начинается с нечетной цифры
if ((current_str[0] - '0') % 2)
{
if (current.IsDoublePalindrom())
{
current.Print();
sum += current.GetNum_10();
}
}
//число начинается с четной цифры
else
{
std::string jump = current_str; //например, 2001
for (int i = 1; i < jump.length(); i++)
jump[i] = '9';
num = ToDecimalNum(jump); //перепрыгиваем на 2999
}
}
std::cout << "SUM = " << sum;
}
//--------------------------------------------------------------------MAIN
int main()
{
DoublePalindroms(10000000);
std::cin.get();
return 0;
}
//--------------------------------------------------------------------------
Результат:
|