1170:计算2的N次方
【题目描述】
任意给定一个正整数N(N<=100),计算2的n次方的值。
【输入】
输入一个正整数N。
【输出】
输出2的N次方的值。
【输入样例】
5
【输出样例】
32
【快速幂的原理】
【图片来源】https://www.jianshu.com/p/ec0b97676c3e
【参考答案】
#include<iostream>
#include<cstring>
using namespace std;
void change(string s,int arr[]){
arr[0] = s.length();
for(int i=1;i<=arr[0];i++){
arr[i] = s[arr[0]-i]-'0';
}
}
void copyArr(int a[],int b[]){
for(int i=0;i<=b[0];i++){
a[i] = b[i];
}
}
void mul(int a[],int b[]){
int c[205];
memset(c,0,sizeof(c));
c[0] = a[0]+b[0];
for(int i=1;i<=a[0];i++){
for(int j=1;j<=b[0];j++){
c[i+j-1] += a[i]*b[j];
c[i+j] += c[i+j-1]/10;
c[i+j-1] %= 10;
}
}
while( c[c[0]] ==0 && c[0]>1) c[0]--;
copyArr(a,c);
}
void mul(int a[]){
int c[205];
memset(c,0,sizeof(c));
c[0] = a[0]+a[0];
for(int i=1;i<=a[0];i++){
for(int j=1;j<=a[0];j++){
c[i+j-1] += a[i]*a[j];
c[i+j] += c[i+j-1]/10;
c[i+j-1] %= 10;
}
}
while( c[c[0]] ==0 && c[0]>1) c[0]--;
copyArr(a,c);
}
void print(int arr[]){
for(int i=arr[0];i>=1;i--){
cout<<arr[i];
}
cout<<endl;
}
int base[100],c[100];
int main(){
base[0] = 1;
base[1] = 2;
c[0] = 1;
c[1] = 1;
int n;
cin>>n;
for(int i=n;i!=0;i>>=1){
if( i&1 ){
mul(c,base);
}
mul(base);
// print(base);
}
print(c);
return 0;
}