Korotkodul

Ломоносов_N2

Nov 11th, 2021 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <map>
  6. using namespace std;
  7. using ll = long long;
  8.  
  9. void cv(vector <auto> v){
  10.     cout<<'\n';
  11.     for (auto x: v){
  12.         cout<<x<<' ';
  13.     }cout<<'\n';
  14. }
  15.  
  16. void cm(map <auto, auto> m){
  17.     cout<<'\n';
  18.     for (auto x: m) cout<<x.first<<' '<<x.second<<'\n';
  19.     cout<<'\n';
  20. }
  21.  
  22. string rl(string x){//real - without 1st zeroes
  23.     int sz = x.size();
  24.     int no_0 = sz - 1;
  25.     for (int i = 0;i<sz;++i){
  26.         if (x[i]!= '0'){
  27.             no_0 = i;
  28.             break;
  29.         }
  30.     }
  31.     string y = x.substr(no_0);
  32.     return y;
  33. }
  34.  
  35.  
  36. string pr2(string x){
  37.     int rest = 0, dig_now, dig;
  38.     reverse(x.begin(), x.end());
  39.     int sz = x.size();
  40.     string ans = "";
  41.     for (int i = 0; i < sz; ++i){
  42.         dig_now = (x[i] - '0') * 2 + rest;
  43.         dig = dig_now % 10;
  44.         ans += (dig + 48);
  45.         rest = dig_now / 10;
  46.         //cout<<"ans += "<<(dig + 48)<<"  rest = "<<rest<<'\n';
  47.     }
  48.     if (rest != 0) ans += (rest + 48);
  49.     reverse(ans.begin(), ans.end());
  50.     //cout<<"ans = "<<ans<<'\n';
  51.     return ans;
  52. }
  53.  
  54.  
  55. string dv2(string x){
  56.     //взять 1-й кусокй, который >= 2
  57.     int idx = 0;
  58.     int rest = 0;
  59.     int now_d;
  60.     now_d = x[0] - '0';
  61.     int sz = x.size();
  62.     if (x[0] == '1'){
  63.         now_d = now_d * 10 + (x[1] - '0');
  64.         idx++;
  65.     }
  66.     string ans = "";
  67.     ans += (now_d / 2 + 48);
  68.     rest = (now_d % 2);
  69.     while (idx < sz){
  70.         idx++;
  71.         now_d = rest * 10 + (x[idx] - '0');
  72.         ans += (now_d / 2 + 48);
  73.         rest = now_d % 2;
  74.     }
  75.     ans.pop_back();
  76.     //cout<<"ans = "<<ans<<'\n';
  77.     return ans;
  78. }
  79.  
  80.  
  81. string op1(string x){
  82.     return pr2(x);
  83. }
  84.  
  85. string op2(string x){
  86.     int sz = x.size();
  87.     if ( (x[sz-1] - '0') % 2 == 0){
  88.         return dv2(x);
  89.     } else{
  90.         return "NO";
  91.     }
  92. }
  93.  
  94. string op3(string x){
  95.     int sz = x.size();
  96.     if (sz % 2 == 1){
  97.         return "NO";
  98.     } else{
  99.         int len = sz / 2;
  100.         string a,b;
  101.         a = x.substr(0, len);
  102.         b = x.substr(len);
  103.         return a ;
  104.     }
  105. }
  106.  
  107. string op4(string x){
  108.     int sz = x.size();
  109.     if (sz % 2 == 1){
  110.         return "NO";
  111.     } else{
  112.         int len = sz / 2;
  113.         string a,b;
  114.         a = x.substr(0, len);
  115.         b = x.substr(len);
  116.         return b;
  117.     }
  118. }
  119.  
  120. string op5(string x){
  121.     int sz = x.size();
  122.     if (sz % 2 == 1){
  123.         return "NO";
  124.     } else{
  125.         int len = sz / 2;
  126.         string a,b;
  127.         a = x.substr(0, len);
  128.         b = x.substr(len);
  129.         return a + a;
  130.     }
  131. }
  132.  
  133. string op6(string x){
  134.     int sz = x.size();
  135.     if (sz % 2 == 1){
  136.         return "NO";
  137.     } else{
  138.         int len = sz / 2;
  139.         string a,b;
  140.         a = x.substr(0, len);
  141.         b = x.substr(len);
  142.         return b + b;
  143.     }
  144. }
  145.  
  146. bool half_1(string x){
  147.     int sz = x.size();
  148.     bool A = (sz%2==0);
  149.     if (A){
  150.         string a,b;
  151.         a = x.substr(0, sz / 2);
  152.         b = x.substr(sz / 2);
  153.         //cout<<"ab= "<<a<<' '<<b<<'\n';
  154.         bool B = (a.find('1') >= 0 && a.find('1') < (int)a.size());
  155.         bool C = (b.find('1') >= 0 && b.find('1') < (int)b.size());
  156.         return B;
  157.     }
  158.     else{
  159.         return false;
  160.     }
  161. }
  162.  
  163. bool half_2(string x){
  164.     int sz = x.size();
  165.     bool A = (sz%2==0);
  166.     if (A){
  167.         string a,b;
  168.         a = x.substr(0, sz / 2);
  169.         b = x.substr(sz / 2);
  170.         //cout<<"ab= "<<a<<' '<<b<<'\n';
  171.         bool B = (a.find('1') >= 0 && a.find('1') < (int)a.size());
  172.         bool C = (b.find('1') >= 0 && b.find('1') < (int)b.size());
  173.         return C;
  174.     }
  175.     else{
  176.         return false;
  177.     }
  178. }
  179.  
  180.  
  181. bool even(string x){
  182.     int sz = x.size();
  183.     char l = x[sz-1];
  184.     int d = l - '0';
  185.     return d % 2 == 0;
  186. }
  187. bool half(string x){
  188.     int sz = x.size();
  189.     bool A = (sz%2==0);
  190.     return A;
  191. }
  192.  
  193.  
  194. int main()
  195. {
  196.     //ВОПРОС: что сначала: делить или умножать на 2?
  197.     string n;
  198.     cin>>n;
  199.     string path = "";
  200.     while ( n != "1"){
  201.         cout<<"n = "<<n<<'\n';
  202.         if (n == "2" || n == "4"){
  203.             while (n != "1"){
  204.                 n = op2(n);
  205.                 path += '2';
  206.                 cout<<"n = "<<n<<'\n';
  207.             }
  208.         }
  209.         else if (half_1(n)){
  210.             n = op3(n);
  211.             path += '3';
  212.         }
  213.         else if (half_2(n)){
  214.             n = op4(n);
  215.             path += '4';
  216.         }
  217.         else if (half(n)){
  218.             n = op3(n);
  219.             path += '3';
  220.         }
  221.         else if (even(n)){
  222.             n = op2(n);
  223.             path += '2';
  224.         }
  225.         else if (!half(n)){
  226.             while (!half(n)){
  227.                 n = op1(n);
  228.                 path += '1';
  229.                 cout<<"n = "<<n<<'\n';
  230.             }
  231.         }
  232.  
  233.  
  234.     }
  235.     cout<<(int)path.size()<<'\n';
  236.     cout<<path<<'\n';
  237. }
  238. /* last variant  - сначала делим - пример тупой реализации:
  239. 222
  240. n = 222
  241. n = 111
  242. n = 222
  243. n = 444
  244. n = 888
  245. n = 1776
  246. n = 1776
  247. n = 17
  248. 7
  249. 2111133
  250. */
  251. /*
  252. сначала умножаем
  253. 327198
  254. n = 327198
  255. n = 198
  256. n = 396
  257. n = 792
  258. n = 1584
  259. n = 1584
  260. n = 15
  261. 6
  262. 411133
  263. */
  264. /*
  265. сначла делим
  266. 327198
  267. n = 327198
  268. n = 198
  269. n = 99
  270. n = 9
  271. n = 18
  272. n = 18
  273. 5
  274. 42313
  275. */
  276. //132903291037983279838219032183263284948179089128218199219129099
  277.  
Add Comment
Please, Sign In to add comment