目录
一,题目
二,思路
三,代码
一,题目
描述
任意给定一个正整数N(N<=100),计算2的n次方的值。
输入描述
输入一个正整数N。
输出描述
输出2的N次方的值。
用例输入 1
5
用例输出 1
32
二,思路
以2为底的指数如下:
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
.
.
.
- 可以看到,只有当次数 n 为 0 时 2 的 0 次 方 结果为 1(1不是2的倍数),接下来的结果全是2的倍数(可以用与2有关的表达式计算出来),因此,可以将n=0时的这一项作为特殊项:如果n=0,那么直接输出结果1。
- 如果n是大于>=1的数,那么就可以使用迭代的方法来计算结果:
要想最后可以输出结果,就得需要定义一个变量来存储程序运行过程中的结果值
· 这里我使用了整型的vector容器,因为2的n次方数可能超出标准数据类型的范围,所以可以使用的数据类型有string类和vector容器,这两个数据类型都有很大的空间,由于计算过程需要不断的将结果值的每一位×2,因此,string类排除掉(也可以用,需要的过程会较多)。
· 由于n==0时的值已经输出,n>0的结果就可以以2为初始值,整型元素2只占一位,因此,在定义声明vector容器(vector<int> r;) 并指定元素个数 1 和元素值 2 时,需要如下写:
vector<int> r (1,2);//表示目前该容器只有1个值为1的整型元素
需要注意:
因为vector容器和string类一样,都可以扩容,如果计算出的结果位数不止一位,例如当时,,此时vector容器需要扩容,来存储两个元素:整型 1和整型6,vector容器和string类一样,可以通过 push_back() 函数在末尾添加元素),所以不用担心像,这些超过了1个元素的值存不进去。 - 当计算结果的初始值=2,输入的整数为n=4时,只需要执行3次就可以得到的结果,如下:
一次 2*2=4
两次 4*2=8
三次 8*2=16
因此,在写最外层for循环的时候,需要将循环次数设为n-1,既for(int i=0;i<n-1;i++) - 有了最外层的for循环来确保计算次数后,就需要写一个内层循环(主要是将上一次计算的结果中的每一位都乘2再加上进位 c 例如,数字容器中的16,在计算的过程中会先将第一位1 乘 2 加上 进位 0,接着再去将6 乘 2 加上进位 0 得到 12,,之后迭代出新的结果,因此,循环次数设置为上一次迭代结束后的vector容器变量r的大小,既for(int j=0;j<r.size();j++)例如,当输入的次数n=4时,
是通过再乘迭代出来,由于不能一次性将1和6这两个元素同时放入容器变量 r 中,所以需要进行两步操作:
1)由一个元素 8 到两个元素 61 :
① 先将8乘2,得到结果 x =r[0]*2+c=16,因为 c 存储的是进位,需要将变量 c 定义在外层循环 和 内层循环之间,并且,在每一次的运算中,将c 的初始值设为0,清空上一次运算的进位。
② 变量 x是处理上一次计算结果的每一位,需要定义在内层循环里面(内层循环对数位进行操作),之后将 x 的 个位数放入容器变量 r 中(既r[j]=x%10+c;) ,现在容器 r 中的元素从8变成了6
③接着再处理剩下的1,1在16中,是在十位上的数,因此,将x整除10一次就可以得到十位上的数,并使用变量 c 存储。如下图👇
2)由两个元素 16 到两个元素23 :,如下图👇 - 容器 r 和数组一样,下标也是从0开始,最后一个元素的下标为
r.size()-1
最后使用for循环倒叙输出容器 r 即可,
三,代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n==0) cout<<1;
vector<int> r(1,2);
for(int i=0;i<n-1;i++){
int c=0;
for(int j=0;j<r.size();j++){
int x=r[j]*2+c;
r[j]=x%10;
c=x/10;
}
while(c){
r.push_back(c%10);
c/=10;
}
}
for(int i=r.size()-1;i>=0;i--){
cout<<r[i];
}
return 0;
}
有问题请在评论区留言或者是私信我,回复时间不超过一天。