Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- short int Divide(short int *A) /// A <- A/X si intoarce A%X
- {
- short int R=0;
- for(short int i=A[0];i;--i,R%=2)
- R=R*10+A[i],A[i]=R/2;
- while(!A[A[0]]&&A[0]>1)
- --A[0];
- return R;
- }
- void MultHuge(short int *A,short int *B) /// A <- A x B
- {
- short int C[1001];
- short int T=0;
- C[0]=A[0]+B[0];
- for(short int i=1;i<=C[0];++i)
- C[i]=0;
- --C[0];
- for(short int i=1;i<=A[0];++i)
- for(short int j=1;j<=B[0];++j)
- C[i+j-1]+=A[i]*B[j];
- for(short int i=1;i<=C[0];++i)
- T+=C[i],C[i]=T%10,T/=10;
- if(T)
- C[++C[0]]=T;
- for(short int i=0;i<=C[0];++i)
- A[i]=C[i];
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- string str;
- cin>>str; /// citesc numarul
- short int n=str.length(),X[501];
- X[0]=0;
- for(short int i=n-1;i>=0;--i) /// pun numarul invers in vectorul X
- X[++X[0]]=str[i]-'0';
- unsigned long long int cnt1=0;
- while(X[0]>1) /// Cat timp mai am ce imparti impart la 2
- {
- short int r=Divide(X);
- if(r) /// numar resturile de 1
- ++cnt1;
- }
- if(X[0]==1) /// Caz perticular (X[1]!=0)
- if(X[1]>1)
- {
- while(X[1]>=1)
- {
- if(X[1]%2) /// adica restul e 1
- ++cnt1;
- X[1]/=2;
- }
- }
- X[0]=X[1]=1; /// acum calculez puterile lui 2 la cnt1
- short int A[2000];
- A[0]=1,A[1]=2;
- while(cnt1) /// Calculez 2^cnt1 (exponentiere logaritmica)
- {
- if(cnt1%2)
- MultHuge(X,A); /// X <- X*A (Initial A e 2)
- MultHuge(A,A); /// A <- AxA
- cnt1/=2;
- }
- for(short int i=X[0];i>=1;--i)
- cout<<X[i];
- cout<<'\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement