高精度计算原因
- C++不支持大数运算,所以要进行高精度算法。
- 高精度乘法将大数以字符串形式输入,然后利用数组拆分转换为一位一位的整数,之后按照小学的竖式运算方法完成编码。
- 对最高位做判断,删除前导0,然后输出便得结果。
高精度乘法思路
- 定义存储字符串数组和获取次方N。
- 将每个单位的数单独存入数组。
- 结合对位运算的理解定义len,利用循环进行N次2次方计算。
- 从第一位开始利用循环模拟竖式乘法的过程,每满10对其后一位数组进1,len长度加一,完成整个乘法过程。
- 删除前导 0 。所谓前导零,就是最后倒叙输出结果出现类似这样数据 01234,这个 0 实际是不需要的。
- 输出乘法的结果。倒序输出乘法的结果数组 n,因为我们最初的1是存储在下标为 0 的地方。
解法步骤
题目
2的n次方
Description
任意给定一个正整数N(N<=500),计算2的n次方的值。
Input
输入一个正整数N。
Output
输出2的N次方的值
// 创建数组n[505]用来运算且存储次方后的结果(这里多出5是防止溢出), 用 memset(a,0,sizeof(a)) 给数组初始化;
// 创建数组n[505]用来运算且存储次方后的结果,
// 用 memset(a,0,sizeof(a)) 给数组初始化;
int n[505];
memset (n, 0, sizeof(n));
// 根据 1<<N位运算 给数组第一位赋初值1
n[0] = 1;
// len 表示进行次方运算前数的位数,此时数值为1,位数为1
int len = 1, N;
cin >> N;
/*
i控制循环,j控制数组中的每位数进行*2.
遍历将n[j]*2,若n[j]大于10,取得个位值并进位值1给n[j+1].
*/
/*
i控制循环,j控制数组中的每位数进行*2.
遍历将n[j]*2,若n[j]大于10,取得个位值并进位值1给n[j+1].
*/
for (int i = 0; i < N; i++) {
// 对目前每个单位上的数值*2
for (int j = 0; j < len; j++)
n[j] *= 2;
// 对n[j]大于10的进行换值并进位
for (int k = 0; k < len; k++) {
if (n[k] > 9) {
n[k+1] += n[k] / 10; // n[j+1]++;
n[k] %= 10; // n[j] -= 10;
// 到最后一个单位大于10时,单位数增加1
if (k == len-1)
len++;
}
}
}
最后倒序输出结果:
// 倒序打印输出
for (int i = len-1; i >= 0; i--)
cout << n[i];
最后完整代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 创建数组n[505]用来运算且存储次方后的结果,
// 用 memset(a,0,sizeof(a)) 给数组初始化;
int n[505];
memset (n, 0, sizeof(n));
// 根据 1<<N位运算 给数组第一位赋初值1
n[0] = 1;
// len 表示进行次方运算前数的位数,此时数值为1,位数为1
int len = 1, N;
cin >> N;
/*
i控制循环,j控制数组中的每位数进行*2.
遍历将n[j]*2,若n[j]大于10,取得个位值并进位值1给n[j+1].
*/
for (int i = 0; i < N; i++) {
// 对目前每个单位上的数值*2
for (int j = 0; j < len; j++)
n[j] *= 2;
// 对n[j]大于10的进行换值并进位
for (int k = 0; k < len; k++) {
if (n[k] > 9) {
n[k+1] += n[k] / 10; // n[j+1]++;
n[k] %= 10; // n[j] -= 10;
// 到最后一个单位大于10时,单位数增加1
if (k == len-1)
len++;
}
}
}
// 倒序打印输出
for (int i = len-1; i >= 0; i--)
cout << n[i];
return 0;
}