【题目描述】
任意给定一个正整数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