信息学奥赛一本通:1170:计算2的N次方

1170:计算2的N次方


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 27334     通过数: 14606 

【题目描述】

任意给定一个正整数N(N<=100),计算2的n次方的值。

【输入】

输入一个正整数N。

【输出】

输出2的N次方的值。

【输入样例】

5

【输出样例】

32

因为n次方的值较大,用字符串形式存储和计算。

第一种方法:用加法的方式计算(字符串)

#include<iostream>
#include<cmath> 
#include<cstring>
char a[205],b[205],c[205];
using namespace std;
int main()
{
	int m=0,t,n,q,r,i=0,j=0,k=0,sum;
scanf("%d",&r);
a[0]='1';//a中置字符1
for(q=0;q<r;q++)//是0的话,不循环,从1开始循环计算
{
m=strlen(a);
strcpy(b,a);//a与b相等,然后它们两个相加,即乘以2了
n=strlen(b);
for(i=m-1;i>=0;i--)//从最后一个字符(即个位开始计算)
{
	k=0;//进位置0(在i=0时,还有进位)
	a[i]=a[i]-'0'+b[i]-'0';
	if(a[i]>=10){//如果有进位
	a[i]=a[i]-10;
	a[i-1]+=1;
	if(i-1==-1)k=1;}//如果到了最前面,还有进位k=1
	a[i]+='0';//转换为字符
}
if(k==1)//处理进位,移动,然后加入进位在最高位,即a[0]处
{
for(t=m-1;t>=0;t--)
{
	a[t+1]=a[t];
}
a[0]='1';
a[m+1]='\0';//加入结束标志
}
strcpy(b,a);//准备下次相加
}
printf("%s",a);
return 0;
}

第二种:用乘法(整型数*2)

#include<iostream>
#include<cmath> 
#include<cstring>
using namespace std;
 int a[1000010];
  int main() {

     int i,len,n;
    scanf("%d",&n);
    a[0]=1;
     len=1;//长度为1
     for(int k=1; k<=n; k++) {//从1开始到        n
         for(i=0; i<len; i++) {//每位*2
             a[i]=a[i]*2;
       }
        for(i=0; i<len; i++) {//从0位开始,看是否大于10了,往后进位,不一定进1,所以用除和模
             if(a[i]>=10) {
                a[i+1]+=a[i]/10;
                 a[i]%=10;
            }
         }
         while(a[len]>0) {//这个位上有数,就用除和模再计算
            len++;
             a[len]=a[len-1]/10;
             a[len-1]=a[len-1]%10;
         }
     }
     for(i=len-1; i>=0; i--)//倒着输出(后面是高位,前面是低位)
         printf("%d",a[i]);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值