12:计算2的N次方
描述
任意给定一个正整数N(N<=100),计算2的n次方的值。
输入
输入一个正整数N。
输出
输出2的N次方的值。
简单的解释一下为什么这题要用数组写。
题目要求的是求2的n次方,2^100有多大呢有10^30那么大,在C语言中最大的long long也只有2^63那么大,大概10^18,所以我们就要用数组来模拟
那我们该如何用数组模拟呢(这也是大多数人想问的问题吧) 我下面画个图就很容易理解了(应该十分清晰)
我这里建立了一个大小为10的数组(方便解释)
第一行是数组的编号,这个应该没问题吧,有问题的话去看https://blog.csdn.net/chdcb/article/details/120630200?spm=1001.2014.3001.5501
我们都知道2^0=1,所以我在末尾那里赋值了个1
假如我们要求2^5,我用数组模拟一下流程
发现了什么,a[9](a是数组名字)那里变成了2,此时是2^1
a[9]那里变成了4,此时是2^2
a[9]那里变成了8,此时是2^3
a[9]那里变成了16,此时是2^4(聪明的你一定发现了问题所在吧)
我们的目标是每一位数组存一个数字,所以当一位数组的里面数字>=10时我们要做进一操作
这个样子才是我们需要的数组形式,这下你一定可以发现为什么要用数组模拟了吧,我们只需要求每一位*2就可以了,这样就不怕会爆范围了,如果>=10进一就行了,数组可以开很大(开个1e6不是问题)
而这道题数组大小大概只要30就行了
我们继续模拟 2^5
进一处理一下
大致思路是这样的(下面结合代码讲解)
#include<stdio.h>
int main(){
int a[501]={0}; //开一个大小为500的数组(小一点也无所谓的)
a[500]=1; //a[500]赋值为1因为2^0=1
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){ //乘以n次2
for(int j=1;j<=500;j++){ //每一位都乘
a[j]*=2;
}
for(int j=500;j>=1;j--){ //从后往前进一,这个应该没啥问题
if(a[j]>=10){
a[j-1]+=a[j]/10;
a[j]%=10;
}
}
}
bool flag=false;
for(int i=1;i<=500;i++){
if(a[i]!=0){ //flag用来去除前导0
flag=true;
}
if(flag){
printf("%d",a[i]);
}
}
}