高精度计算原因

  1. C++不支持大数运算,所以要进行高精度算法。
  2. 高精度乘法将大数以字符串形式输入,然后利用数组拆分转换为一位一位的整数,之后按照小学的竖式运算方法完成编码。
  3. 对最高位做判断,删除前导0,然后输出便得结果。

 高精度乘法思路

  1. 定义存储字符串数组和获取次方N。 
  2. 将每个单位的数单独存入数组。
  3. 结合对位运算的理解定义len,利用循环进行N次2次方计算。
  4. 从第一位开始利用循环模拟竖式乘法的过程,每满10对其后一位数组进1,len长度加一,完成整个乘法过程。
  5. 删除前导 0 。所谓前导零,就是最后倒叙输出结果出现类似这样数据 01234,这个 0 实际是不需要的。
  6. 输出乘法的结果。倒序输出乘法的结果数组 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;
}