NOI openjudge 计算2的N次方

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

0123456789
0000000001

我们都知道2^0=1,所以我在末尾那里赋值了个1

假如我们要求2^5,我用数组模拟一下流程

0123456789
0000000002

发现了什么,a[9](a是数组名字)那里变成了2,此时是2^1

0123456789
0000000004

a[9]那里变成了4,此时是2^2

0123456789
0000000008

a[9]那里变成了8,此时是2^3

0123456789
00000000016

a[9]那里变成了16,此时是2^4(聪明的你一定发现了问题所在吧)

我们的目标是每一位数组存一个数字,所以当一位数组的里面数字>=10时我们要做进一操作

0123456789
0000000016

这个样子才是我们需要的数组形式,这下你一定可以发现为什么要用数组模拟了吧,我们只需要求每一位*2就可以了,这样就不怕会爆范围了,如果>=10进一就行了,数组可以开很大(开个1e6不是问题)       

而这道题数组大小大概只要30就行了

我们继续模拟  2^5

0123456789
00000000212

进一处理一下

0123456789
0000000032

大致思路是这样的(下面结合代码讲解)

#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]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chd44

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值