《信息学奥赛一本通》第166题:计算2的N次方
计算 2 的 N 次方
任意给定一个正整数 n (n<=100),计算 2 的 n 次方的值。
输入:
一个正整数 n。
输出:
2 的 n 次方的值。
样例输入:
5
样例输出:
32
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 166 题:计算 2 的 N 次方。

一、题目描述
任意给定一个正整数 n (n<=100),计算 2 的 n 次方的值。
输入:
一个正整数 n。
输出:
2 的 n 次方的值。
样例输入:
5
样例输出:
32
二、题意分析
这道题是信息学奥赛一本通练习题的第 166 题。
根据输入描述,输入一个正整数 n,使用 int 类型。
cpp
int n;
cin>>n;
输入完成后,分析题目,题目要求我们计算 2 的 n 次方的值,如果要计算 2 的 n 次方的值,可以使用 pow 函数,直接输出即可。
但是数据量比较大,因此需要考虑用高精度来实现。
因此需要定义一个数组来存储这些数据,元素个数为 10000。
cpp
int a[10000];
结果的初始值为 1。
cpp
a[1]=1;
新建一个变量计算进位,同样初始化为 0。
cpp
int x=0;
计算 n 次,使用 for 循环实现。
cpp
for(int i=1;i<=n;i++)
{
}
求的结果存储在 a数组中,定义一个变量存储结果的长度。
cpp
int len=1;//len为位数,初始值为1
for(int j=1;j<=len;j++)
{
}
得数的每一位都乘以 2 并加进位。
cpp
a[j]=a[j]*2+x;//得数的每一位都乘2再加进位
x=a[j]/10;//计算进位
a[j]%=10;//保留个位数
特别注意:如果计算到有最高位并且有进位,长度加 1。
cpp
if(x!=0&&j==len) len++;
最后倒序输出结果。
cpp
for(int i=len;i>=1;i--)
{
cout<<a[i];
}
按照样例输入对数据进行验证。

符合样例输出,到网站提交测评。
大数的计算测试一下。

结果正确。
三、完整代码
该题的完整代码如下:
cpp
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[10000];
int main()
{
int n;
cin>>n;
a[1]=1;
int x=0;
int len=1;//len为位数,初始值为1
for(int k=1;k<=n;k++)
{
for(int j=1;j<=len;j++)
{
a[j]=a[j]*2+x;//得数的每一位都乘2再加进位
x=a[j]/10;//计算进位
a[j]%=10;//保留个位数
if(x!=0&&j==len) len++;
}
}
for(int i=len;i>=1;i--)
{
cout<<a[i];
}
return 0;
}
四、总结
通过本题《计算 2 的 N 次方》的学习,我们掌握了高精度乘法的基本思想与实现方法。当 n 较大(如超过 30)时,普通整型或长整型已经无法存储 2n2^n2n 的结果,因此必须使用数组来模拟手算过程。
在本题中,我们重点练习了以下几个知识点:
高精度存储:
使用整型数组 a[]
按位存储结果,每个元素代表一个十进制位,解决了普通数据类型无法容纳大数的问题。
逐位乘法与进位处理:
从最低位开始,每一位都乘以 2,并加上前一位的进位值 x,通过 /10 和 %10 操作分别得到新的进位与当前位的值。
长度控制与扩展:
若最高位产生进位,则需要将当前结果长度 len 加 1,保证数组能完整保存计算结果。
逆序输出结果:
由于计算过程中低位在前,高位在后,最终输出时需从 len 到 1 倒序打印,得到正确的数值顺序。
技巧总结:
高精度乘法的核心思想是"按位运算 + 手动进位"。
初始化结果为 1,从第 1 次乘到第 n 次,每次都完整遍历数组。
输出时一定要注意倒序,否则结果会反向。
通过本题的练习,我们不仅掌握了大数乘法的实现过程,也为后续学习高精度加减乘除运算打下了坚实的基础。
---end---
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~