#t215. 计算 2 的幂
计算 2 的幂
计算 2 的幂
题目描述
给定非负整数,求。
输入格式
一个整数。
输出格式
一个整数,即的次方。
样例输入
3
样例输出
8
提示
这道题有两个新东西:乘方怎么写,以及整数装不下怎么办。
一、^ 不是乘方
C++ 里 ^ 是按位异或(一种二进制运算),不是数学上的乘方:
printf("%d\n", 2 ^ 3); // 1,不是 8
要算乘方,两种写法:
int a = 2 * 2 * 2; // 连乘,最快最准
double b = pow(2, 3); // 需要 <cmath>,返回小数
整数幂优先用连乘:pow 返回 double,数一大就有精度误差,pow(2,30) 可能打出 1073741823 这种差一的值。
二、int 能装多大
int 一般 32 位,范围是:
2^31 = 2147483648 刚好超出,存进去会变成负数(溢出)。这种错误不会报错,只会算出莫名其妙的结果。
三、装不下就用 long long
long long x; // 约 ±9.2 × 10^18
scanf("%lld", &x); // 读:%lld
printf("%lld\n", x); // 写:%lld
long long y = 1LL << 40; // 字面量加 LL 后缀
三个地方必须同时改成 long long / %lld:变量声明、scanf、printf。漏一个就会读错或打错。
四、自检
算完后用估算验证:2^10 ≈ 1000,2^20 ≈ 100 万,2^30 ≈ 10 亿。如果题目 n 能到 30 以上,int 基本都不够,直接上 long long。
- 先确认结果最大会到多少,再决定变量用什么类型——这是本题真正的考点。
- 选一种求幂的写法:数学函数、循环累乘、移位都行,但要保证结果类型装得下。
自查:用
n=0(答案 1)和n=31(2147483648)两个边界自查;后者若输出负数,就是类型溢出了。