Advertisement
BorrowTheProgrammer

Volosatova_doch_huini

Dec 13th, 2020
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.00 KB | None | 0 0
  1. /*
  2. Данная программа проверяет,
  3. можно ли составить из заданного числа
  4. полиндром методом конечных сумм
  5. */
  6.  
  7. #include <iostream>
  8. #include <cstdlib>
  9. #include <cmath>
  10. #include <sstream>
  11. #include <cstring>
  12. #include <regex>
  13. #include <iomanip>
  14.  
  15. #define EPS 10        //конечное число шагов
  16.  
  17. using namespace std;
  18.  
  19. int digit_check (const char* argv) {
  20. std::string str = argv;
  21. std::cmatch result;
  22. std::regex regular ("[A-Fa-f0-9]+");
  23.  
  24. if (std::regex_match(str.c_str(), result, regular))
  25. return 1;
  26. else return 0;
  27. }
  28.  
  29. long reverse(long a)      //функция переворота числа
  30. {
  31.   long y = 0;
  32.   while(a)
  33.   {
  34.     y = y * 10 + a % 10;
  35.     a /= 10;
  36.   }
  37.   return y;
  38. }
  39.  
  40. int bin_sum(int a, int b)
  41. {
  42. int sum = 0, digit = 0, carry = 0, digit_rank = 1;
  43.  
  44. // Calculate the sum
  45. while (a > 0 || b > 0 || carry)
  46. {
  47. // Calculate the digit
  48. digit = a % 10 + b % 10 + carry;
  49.  
  50. // Determine if you should carry or not
  51. if (digit > 1)
  52. {
  53. carry = 1;
  54. digit %= 2;
  55. }
  56. else
  57. carry = 0;
  58.  
  59. // Add the digit at the beggining of the sum
  60. sum += digit * digit_rank;
  61. digit_rank *= 10;
  62.  
  63. // Get rid of the digits of a and b we used
  64. a /= 10;
  65. b /= 10;
  66. }
  67. return sum;
  68. }
  69.  
  70. int octal_sum(int a, int b)
  71. {
  72. int sum = 0, digit = 0, carry = 0, digit_rank = 1;
  73.  
  74. // Calculate the sum
  75. while (a > 0 || b > 0 || carry)
  76. {
  77. // Calculate the digit
  78. digit = a % 10 + b % 10 + carry;
  79.  
  80. // Determine if you should carry or not
  81. if (digit > 7)
  82. {
  83. carry = 1;
  84. digit %= 8;
  85. }
  86. else
  87. carry = 0;
  88.  
  89. // Add the digit at the beggining of the sum
  90. sum += digit * digit_rank;
  91. digit_rank *= 10;
  92.  
  93. // Get rid of the digits of a and b we used
  94. a /= 10;
  95. b /= 10;
  96. }
  97. return sum;
  98. }
  99. char hex_digit(int num)
  100. {
  101.   switch (num) {
  102.   case 0: return '0';
  103.   case 1: return '1';
  104.   case 2: return '2';
  105.   case 3: return '3';
  106.   case 4: return '4';
  107.   case 5: return '5';
  108.   case 6: return '6';
  109.   case 7: return '7';
  110.   case 8: return '8';
  111.   case 9: return '9';
  112.   case 10: return 'A';
  113.   case 11: return 'B';
  114.   case 12: return 'C';
  115.   case 13: return 'D';
  116.   case 14: return 'E';
  117.   case 15: return 'F';
  118.   }
  119. }
  120.  
  121. std::string shifting2(int num)
  122. {
  123.     std::string B[16] = { "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" };
  124.     std::string answr = "";
  125.     int A[16] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  126.     int num2;
  127.     int ssc[33];
  128.     int i = 0;
  129.     while (num != 0) {
  130.         num2 = num / 16;
  131.         ssc[i] = num - (num2 * 16);
  132.         num = num2;
  133.         i++;
  134.     }
  135.     for (int j = i-1; j >= 0; j--)
  136.     {
  137.         //std::cout << "im here" << std::endl;
  138.         for (int k = 0; k < 16; k++)
  139.         {
  140.             if (ssc[j] == A[k])
  141.                 answr += B[k];
  142.         }
  143.  
  144.     }
  145.     return answr;
  146. }
  147.  
  148.  
  149.  
  150. class Digit
  151. {
  152. private:
  153.   long long number;       //очередное полученное число, в начале задается аргументом
  154.   const char* number_hex;
  155.   const char* reverse_hex_number;
  156.   long long reverse_number;   //перевернутое вариант числа
  157.   int flags[4];          //2CC, 8CC, 10CC, 16CC
  158.   int answer;
  159. public:
  160.   const char* hex_sum(const char*);
  161.   Digit(long long);       //конструктор преобразования
  162.   Digit(const char*);    
  163.   void set_polindrom();
  164.   int check_polindrom();
  165.   void det_notation();        //метод определяет, в каких СС может быть представлено число
  166.   void get_answer();
  167.   int digit_check_notation();
  168.   void reverse_hex();
  169. };
  170. inline const char* Digit::hex_sum(const char* a){
  171.   int n1, n2;
  172.   std::string s1;
  173.   s1 = a;
  174.   std::istringstream(a) >> std::hex >> n1;
  175.   std::string rev = std::string(s1.rbegin(), s1.rend());
  176.   std::istringstream(rev) >> std::hex >> n2;
  177.   //cout << n1 <<", " << n2 << endl;
  178.   //cout << "s1:" << rev << endl;
  179.   const char* crev = rev.c_str();
  180.   reverse_hex_number = crev;
  181.   //cout << crev << endl;
  182.   cout << "Перевернутое число равно: " << reverse_hex_number << endl;
  183.   int sum = n1 + n2;
  184.   std::string sum1 = shifting2(sum);
  185.  
  186.   const char* cstr = sum1.c_str();
  187.   number_hex = cstr;
  188.   std::cout << "Их сумма равна: " << cstr << std::endl;
  189.   return cstr;
  190. }
  191. /*inline void Digit::reverse_hex()
  192. {
  193.   int str1 = strlen(number_hex);
  194.   char* str2 = new char[str1];
  195.   strcpy(str2, number_hex);
  196.   char* str3 = new char[str1];
  197.   int i;
  198.   int j = 0;
  199.   for(i = str1-1; i >= 0; i--, j++)
  200.   {
  201.     str3[j] = str2[i];
  202.   }
  203.   reverse_hex_number = str3;
  204.   cout << str3;
  205.   delete str2;
  206.   delete str3;
  207.  
  208. }*/
  209. inline int Digit::digit_check_notation () {
  210. std::string str = number_hex;
  211. std::cmatch result;
  212. std::regex regular2 ("[0-1]+");
  213. std::regex regular8("[0-7]+");
  214. std::regex regular10 ("[0-9]+");
  215. std::regex regular16 ("[A-Fa-f0-9]+");
  216.  
  217. if (std::regex_match(str.c_str(), result, regular2)) {
  218. number = atoi(number_hex);
  219. }
  220.  
  221. else if (std::regex_match(str.c_str(), result, regular8)){
  222. number = atoi(number_hex);
  223. flags[0] = 0;
  224. }
  225.  
  226. else if (std::regex_match(str.c_str(), result, regular10)){
  227. number = atoi(number_hex);
  228. flags[0] = 0;
  229. flags[1] = 0;
  230. }
  231.  
  232. else if (std::regex_match(str.c_str(), result, regular16))
  233. {
  234.   flags[0] = 0;
  235.   flags[1] = 0;
  236.   flags[2] = 0;
  237. }
  238. }
  239.  
  240. inline Digit::Digit(const char* s)
  241. {
  242.   number_hex = s;
  243.   reverse_number = 0;
  244.   for(int i = 0; i < 4; i++)
  245.     flags[i] = 1;
  246. }
  247. inline void Digit::get_answer()
  248. {
  249.   this->det_notation();     //определяем, в каких СС число может быть представлено
  250.   cout << "Введите, в кокой возможной СС вы хотите провести вычисления" << endl;
  251.   for(int i = 0; i < 4; i++)
  252.     cout << flags[i] << " " << endl;
  253.   if(flags[0])
  254.   {
  255.     cout << "1 - 16CC; 2 - 10CC; 3 - 8CC; 4 - 2CC" << endl;
  256.     cin >> answer;
  257.   }
  258.   else if(flags[1])
  259.   {
  260.     cout << "1 - 16CC; 2 - 10CC; 3 - 8CC" << endl;
  261.     cin >> answer;
  262.   }
  263.   else if(flags[2])
  264.   {
  265.     cout << "1 - 16CC; 2 - 10CC" << endl;
  266.     cin >> answer;
  267.   }
  268.   else
  269.     cout << "Вы ввели чилсо в 16 СС" << endl;
  270. }
  271. inline void Digit::det_notation()
  272. {
  273.  
  274.  this->digit_check_notation();
  275.  
  276. }
  277.  
  278. inline int Digit::check_polindrom()
  279. {
  280. if(flags[0] != 0 || flags[1] != 0 || flags[2] != 0 && answer != 1)
  281. {
  282.   if(number != reverse(number))
  283.   {
  284.     //cout << "Вощтш" << endl;
  285.     cout << "Сумма данных чисел равная " << number << " не является полиндромом"
  286.          << " для предыдущего числа!" << endl;
  287.     cout << endl;
  288.     return 1;
  289.   }
  290.   else
  291.   {
  292.     cout << "Их сумма является полиндромом: " << number << ". Итоговое число: "
  293.          << number << endl;
  294.     return 0;
  295.   }
  296. }
  297. else
  298. {
  299.   if(!(strcmp(number_hex, reverse_hex_number)))
  300.   {
  301.     cout << "Сумма данных чисел равная " << number_hex << " не является полиндромом"
  302.          << " для предыдущего числа!" << endl;
  303.     cout << endl;
  304.     return 1;
  305.   }
  306.   else
  307.   {
  308.     cout << "Их сумма является полиндромом: " << number_hex<< ". Итоговое число: "
  309.          << number_hex << endl;
  310.     return 0;
  311.   }
  312. }
  313.  
  314. }
  315.  
  316. inline void Digit::set_polindrom()
  317. {
  318.   if(flags[0] != 0 || flags[1] != 0 || flags[2] != 0 && answer != 1)
  319.   {
  320.     cout << "Текущее число: "<< number << endl;
  321.     reverse_number = reverse(number);
  322.     cout << "Перевернутое число равно: " << reverse_number << endl;
  323.   }
  324.   else
  325.   {
  326.     cout << "Текущее число: "<< number_hex << endl;
  327.     //cout << "Перевернутое число равно: " << reverse_hex_number << endl;
  328.   }
  329.  
  330.   /*for(int i = 0; i < 4; i++)
  331.     cout << flags[i] << " " << endl;
  332.   */
  333.   if(flags[0])
  334.   {
  335.     switch(answer)
  336.     {
  337.       case 4:
  338.         number = bin_sum(number, reverse_number);
  339.         //cout << number << endl;
  340.         break;
  341.       case 3:
  342.         number = octal_sum(number, reverse_number);
  343.         //cout << number << endl;
  344.         break;
  345.       case 2:
  346.         reverse_number = reverse(number);
  347.         number += reverse_number;
  348.         //cout << number << endl;
  349.         break;
  350.       case 1:
  351.         break;
  352.     }
  353.   }
  354.   else if(flags[1])
  355.   {
  356.     switch(answer)
  357.     {
  358.       case 3:
  359.         number = octal_sum(number, reverse_number);
  360.         //cout << number << endl;
  361.         break;
  362.       case 2:
  363.         reverse_number = reverse(number);
  364.         number += reverse_number;
  365.         break;
  366.       case 1:
  367.         break;
  368.     }
  369.   }
  370.   else if(flags[2])
  371.   {
  372.     switch(answer)
  373.     {
  374.       case 2:
  375.         reverse_number = reverse(number);
  376.         number += reverse_number;
  377.         break;
  378.       case 1:
  379.         number_hex = hex_sum(number_hex);
  380.         break;
  381.     }
  382.   }
  383.   else
  384.   {
  385.     //cout << "Djitk" << endl;
  386.     number_hex = hex_sum(number_hex);
  387.   }
  388.  
  389. }
  390.  
  391. /*inline Digit::Digit(long long a)
  392. {
  393.   number = a;
  394.   reverse_number = 0;
  395.   for(int i = 0; i < 4; i++)
  396.     flags[i] = 1;
  397. };*/
  398.  
  399. int main(int argc, const char** argv)
  400. {
  401.   int i = 0;    //счетчик
  402.   Digit* a;
  403.   if(argc != 2)
  404.   {
  405.     cout << "Ошибка во время ввода! "
  406.          << "Введите изначальное число!" << endl;
  407.     exit(255);
  408.   }
  409.   if(digit_check(argv[1]))
  410.   {
  411.     a = new Digit(argv[1]);
  412.     //cout << "hex number" << endl;
  413.   }
  414.   else
  415.   {
  416.     cout << "Ошибка ввода!" << endl;
  417.     exit(255);
  418.   }
  419.   a->get_answer();
  420.   while(i < EPS)
  421.   {
  422.     a->set_polindrom();
  423.     if(a->check_polindrom())      //если полиндром не равен самому себе
  424.       i++;
  425.     else
  426.       break;
  427.   }
  428.   if(i >= EPS)
  429.     cout << "Из введенного Вами числа не возможно получить"
  430.          << " полиндром, используя метод конечных сумм!" << endl;
  431.   delete a;
  432.   return 0;
  433. }
  434.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement