Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.36 KB | None | 0 0
  1. /*
  2.     Aleksandar 'Al3kSaNdaR' Ivanovic
  3.  
  4.     z-koren
  5. */
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <cstring>
  9. #include <cmath>
  10.  
  11. using namespace std;
  12.  
  13. class BigInteger
  14. {
  15.     private :
  16.  
  17.         enum { MAX_LEN = 2012 };
  18.  
  19.         int Number[MAX_LEN];
  20.  
  21.         int Len;
  22.  
  23.     public :
  24.  
  25.         BigInteger ( int Num )
  26.         {
  27.             memset ( Number, 0, sizeof ( Number ) );
  28.  
  29.             Len = 0;
  30.  
  31.             if ( ! Num ) Len++;
  32.  
  33.             while ( Num )
  34.             {
  35.                 Number[Len++] = Num % 10;
  36.  
  37.                 Num /= 10;
  38.             }
  39.         }
  40.  
  41.         BigInteger ( void )
  42.         {
  43.             memset ( Number, 0, sizeof ( Number ) );
  44.  
  45.             Len = 1;
  46.         }
  47.  
  48.         void Print ( void )
  49.         {
  50.             for ( int i = Len - 1; i >= 0; i-- ) printf ( "%d", Number[i] );
  51.  
  52.             printf ( "\n" );
  53.         }
  54.  
  55.         void PrintZKoren ( void )
  56.         {
  57.             printf ( "%d\n", Len );
  58.  
  59.             for ( int i = Len - 1; i >= 0; i-- ) printf ( "%d\n", Number[i] );
  60.         }
  61.  
  62.         void PrintLastDigit ( void )
  63.         {
  64.             printf ( "%d\n", Number[0] );
  65.         }
  66.  
  67.         BigInteger operator + ( const BigInteger & BigInt )
  68.         {
  69.             int Carry = 0;
  70.  
  71.             BigInteger Answer ( * this );
  72.  
  73.             if ( BigInt.Len > Answer.Len ) Answer.Len = BigInt.Len;
  74.  
  75.             for ( int i = 0; i < Answer.Len; i++ )
  76.             {
  77.                 Answer.Number[i] += ( BigInt.Number[i] + Carry );
  78.  
  79.                 Carry = Answer.Number[i] / 10;
  80.  
  81.                 Answer.Number[i] %= 10;
  82.             }
  83.  
  84.             if ( Carry != 0 )
  85.             {
  86.                 Answer.Number[Answer.Len] = Carry;
  87.  
  88.                 Answer.Len++;
  89.             }
  90.  
  91.             return Answer;
  92.         }
  93.  
  94.         BigInteger operator - ( const BigInteger & BigInt )
  95.         {
  96.             BigInteger Answer ( * this );
  97.  
  98.             int Carry = 0;
  99.  
  100.             for ( int i = 0; i < Answer.Len; i++ )
  101.             {
  102.                 Answer.Number[i] = Answer.Number[i] - BigInt.Number[i] - Carry;
  103.  
  104.                 if ( Answer.Number[i] < 0 )
  105.                 {
  106.                     Answer.Number[i] = Answer.Number[i] + 10;
  107.  
  108.                     Carry = 1;
  109.                 }
  110.                 else Carry = 0;
  111.             }
  112.  
  113.             while ( ( ! Answer.Number[Answer.Len - 1] ) && ( Answer.Len > 1 ) ) Answer.Len--;
  114.  
  115.             return Answer;
  116.         }
  117.  
  118.         BigInteger operator * ( const BigInteger & BigInt )
  119.         {
  120.             BigInteger Answer ( 0 );
  121.  
  122.             for ( int i = 0; i < Len; i++ )
  123.             {
  124.                 int Carry = 0;
  125.  
  126.                 for ( int j = 0; j < BigInt.Len; j++ )
  127.                 {
  128.                     int Temp = Answer.Number[i + j] + Number[i] * BigInt.Number[j] + Carry;
  129.  
  130.                     Answer.Number[i + j] = Temp % 10;
  131.  
  132.                     Carry = Temp / 10;
  133.                 }
  134.  
  135.                 Answer.Number[i + BigInt.Len] = Carry;
  136.             }
  137.  
  138.             Answer.Len = Len + BigInt.Len;
  139.  
  140.             while ( ( ! Answer.Number[Answer.Len - 1] ) && ( Answer.Len > 1 ) ) Answer.Len--;
  141.  
  142.             return Answer;
  143.         }
  144.  
  145.         BigInteger operator / ( int Num )
  146.         {
  147.             BigInteger Answer ( 0 );
  148.  
  149.             int Remain = 0;
  150.  
  151.             for ( int i = Len - 1; i >= 0; i-- )
  152.             {
  153.                 Remain = Remain * 10 + Number[i];
  154.  
  155.                 Answer.Number[i] = Remain / Num;
  156.  
  157.                 Remain = Remain % Num;
  158.             }
  159.  
  160.             Answer.Len = Len;
  161.  
  162.             while ( ( ! Answer.Number[Answer.Len - 1] ) && ( Answer.Len > 1 ) ) Answer.Len--;
  163.  
  164.             return Answer;
  165.         }
  166.  
  167.         /*
  168.  
  169.         BigInteger Sqrt ( void )
  170.         {
  171.             BigInteger Low ( 0 ), High ( * this ), Mid;
  172.  
  173.             if ( ( Len == 1 ) && ( Number[0] == 1 ) ) return BigInteger ( 1 );
  174.  
  175.             while ( Low < High )
  176.             {
  177.                 Mid = ( Low + High ) / 2;
  178.  
  179.                 if ( Mid == Low ) break;
  180.  
  181.                 if ( Mid * Mid == ( * this ) )
  182.                 {
  183.                     Low = Mid;
  184.  
  185.                     break;
  186.                 }
  187.  
  188.                 if ( Mid * Mid < ( * this ) ) Low = Mid;
  189.                 else High = Mid;
  190.             }
  191.  
  192.             return Low;
  193.         }
  194.  
  195.         */
  196.  
  197.         BigInteger Sqrt ( void )
  198.         {
  199.             BigInteger Answer ( 0 ), Remain ( 0 ), Odd ( 0 ), Count;
  200.  
  201.             int Length = Len - 1 + Len % 2;
  202.  
  203.             while ( Length >= 0 )
  204.             {
  205.                 BigInteger LastTwo ( Number[Length] * 10 + Number[Length - 1] );
  206.  
  207.                 Odd = Answer * 20 + 1;
  208.  
  209.                 Remain = Remain * 100 + LastTwo;
  210.  
  211.                 Count = 0;
  212.  
  213.                 while ( ( Remain > Odd ) || ( Remain == Odd ) )
  214.                 {
  215.                     Count = Count + 1;
  216.  
  217.                     Remain = Remain - Odd;
  218.  
  219.                     Odd = Odd + 2;
  220.                 }
  221.  
  222.                 Answer = Answer * 10 + Count;
  223.  
  224.                 Length -= 2;
  225.             }
  226.  
  227.             return Answer;
  228.         }
  229.  
  230.         int operator < ( const BigInteger & BigInt )
  231.         {
  232.             if ( Len < BigInt.Len ) return 1;
  233.  
  234.             if ( Len > BigInt.Len ) return 0;
  235.  
  236.             int i;
  237.  
  238.             for ( i = Len - 1; i >= 0; i-- ) if ( Number[i] != BigInt.Number[i] ) break;
  239.  
  240.             if ( i == -1 ) return 0;
  241.  
  242.             if ( Number[i] < BigInt.Number[i] ) return 1;
  243.  
  244.             return 0;
  245.         }
  246.  
  247.         int operator == ( const BigInteger & BigInt )
  248.         {
  249.             if ( Len != BigInt.Len ) return 0;
  250.  
  251.             for ( int i = Len - 1; i >= 0; i-- ) if ( Number[i] != BigInt.Number[i] ) return 0;
  252.  
  253.             return 1;
  254.         }
  255.  
  256.         int operator > ( const BigInteger & BigInt )
  257.         {
  258.             if ( ( * this ) < BigInt ) return 0;
  259.  
  260.             if ( ( * this ) == BigInt ) return 0;
  261.  
  262.             return 1;
  263.         }
  264. };
  265.  
  266. int main ( void )
  267. {
  268.     int N;
  269.  
  270.     BigInteger Number ( 0 );
  271.  
  272.     scanf ( "%d", &N );
  273.  
  274.     for ( int i = 0; i < N; i++ )
  275.     {
  276.         int Digit;
  277.  
  278.         scanf ( "%d", &Digit );
  279.  
  280.         Number = Number * 10 + Digit;
  281.     }
  282.  
  283.     BigInteger Sol = Number.Sqrt ( );
  284.  
  285.     Sol.PrintZKoren ( );
  286.  
  287.     return 0;
  288. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement