首页 > 其他分享 >信息学奥赛一本通:1170:计算2的N次方

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

时间:2024-12-23 09:26:41浏览次数:5  
标签:信息学 lc 10 int 1170 位数 奥赛 字符串 输入

【题目描述】

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

【输入】

输入一个正整数N。

【输出】

输出2的N次方的值。

【输入样例】

5

【输出样例】

32

【参考程序一】

(1)数据的接收方法和存贮方法

         数据的接收和存贮:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算,将每一位数取出,存入数组中。另一种方法是直接用循环加数组方法输入数据。

  void init(int a[])                            //传入一个数组

  {

            string s;

         cin>>s;                                  //读入字符串s

         len=s.length();                     //用len计算字符串s的位数

         for(i=1;i<=len;i++)

            a[i]=s[len-i] -‘0’;               //将数串s转换为数组a,并倒序存储

  }另一种方法是直接用循环加数组方法输入数据。

        (2) 高精度数位数的确定

               位数的确定:接收时往往是用字符串的,所以它的位数就等于字符串的长度。

        (3) 进位,借位处理

               加法进位:c[i]=a[i]+b[i];

                                 if (c[i]>=10) { c[i]%=10; ++c[i+1]; }

          减法借位:if (a[i]<b[i]) { --a[i+1]; a[i]+=10; }

                                 c[i]=a[i]-b[i];

          乘法进位:c[i+j-1]= a[i]*b[j] + x + c[i+j-1];

                                 x = c[i+j-1]/10;

                                 c[i+j-1] %= 10;

        (4) 商和余数的求法

             商和余数处理:视被除数和除数的位数情况进行处理.

#include<bits/stdc++.h>
using namespace std;

int  a_i[200001];

int highPrecisionMulti(int n)
{
	int lc=1,x;
	a_i[1]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=lc;j++)
		{
		    a_i[j]*=2; //每位*2 
		}
		
		
		for(int j=1;j<=lc;j++)
		{
			x=0;//记录位数 
			if(a_i[j]>9)
			{
				a_i[j]%=10;
				a_i[j+1]++;	
				x=max(x,j+1); 
			}     	         	    	 
		}
		lc=max(x,lc);
	}
	
	while(a_i[lc]==0&&lc>=1)//去除计算后的前导0 
	{
		lc--;
	 }
	  
	return lc;
 } 

int main()
{
	int N,lenc;
	cin>>N;

	//高精度乘法 
	lenc=highPrecisionMulti(N);

	for(int i=lenc;i>=1;i--)
	{
		cout<<a_i[i];
	}
	
	return 0;
 }

标签:信息学,lc,10,int,1170,位数,奥赛,字符串,输入
From: https://blog.csdn.net/u014117969/article/details/144657478

相关文章