💯高精度计算(2的n次方)
00 分钟
2023-12-20
2024-3-22
type
status
date
slug
summary
tags
category
icon
password
😀
在计算机中,我们经常使用int或者double等数据类型来存储数据,但是这些数据类型都是有范围的限制的。当运算数据较大时,计算机将会出现溢出情况,使得计算结果不够准确。如果遇到了位数比较高的运算,例如,2的100次方,它的结果有31位,就会出现数据溢出。这时我们可以使用整型数组和字符串来储存这些数据。
 

📝 计算2的n次方(0≤n≤100)

问题描述:

任意给定一个正整数 n(n≤100)N(N≤100),计算 2 的 N 次方的值。

输入格式

输入一个正整数 N

输出格式

输出 2 的 N 次方的值。
 
首先定义两个整型数组ans[50]和mul[50],其中ans[]用于保存结果,mul[50]用于保存中间结果。
ans[50]={0}; 给ans数组中每个元素赋值为0
mul[50]={1}; 给mul[0]赋值为1,其余值赋为0

核心代码解释

  1. 外层循环: for (int i = 0; i < n; i++) 表示要计算2的n次方,所以循环n次。
  1. 内层循环: for (int j = 0, t = 0; j < 1000 || t; j++) 表示对于每一位j,都要计算2的n次方的各位,并存储在ans数组中。内层循环主要用于处理进位和计算各位的值。第二层内层循环for (int i = 0; i < n; i++) 复制结果到mul[]数组中去。
    • t += mul[j] * 2; 这里mul数组存储了原始数字的各个位乘以2的结果,将该结果加到t上,模拟了乘法过程。
    • ans[len++] = t % 10; 将t的最后一位(个位数)存储到ans数组中,并递增len。
    • t /= 10; 将t右移一位,相当于去掉已经处理的个位数,准备处理下一位
     
     
    首先把 1 放到mul 数组中,然后进行乘以 2 ,将得出的结果 2 存储到 ans数组中;然后我们将 mul 数组清空,再将上一次乘以 2 的结果存储到 mul 中,然后将 ans 清空来继续下一次循环,重新存储下一次乘以 2 的结果。不断的循环这一步骤直到循环 N 次,即求出 2^N 的结果。最终倒着输出即可
    计算时,例如输入n=5。第一层循环循环5次,每一次的外层循环,内层循环都会循环50次甚至更多。(当n较小时ans的高位多为0,不影响运算速度)每次内次循环都是从j=0开始的,也就是从个位数先乘起,并且每次内层循环开始len=0,ans从个位数加起取t对10的余数(保留此时数字参加下一次循环),然后进行len++操作,最后将t向右移一位继续进行运算。
     
    最后在输出结果时记得去除前导数0。

    🤗 总结归纳

    在平时做题的过程中,例如大整数加法,较大数字的阶乘时,都是运用类似的方法。

    📎 参考文章

     
    💡