???內(nèi)容專欄:《C/C++專欄》
??本文概括: 計(jì)算高精度的2的N次方數(shù)字。
??本文作者:花 碟
??發(fā)布時(shí)間:2023.6.22
?前言
為什么不直接利用int、float、double等類型進(jìn)行存儲計(jì)算,因?yàn)樗鼈兪谴嬖谟行?shù)據(jù)范圍的, 比如說int的范圍是 -2147483648 ~ 2147483647
字節(jié),數(shù)值最多占據(jù)10位,8字節(jié)的 long int 型的取值范圍是-9,223,372,036,854,775,808~9,223,372,036,854,775,807
,而如果想存儲更大的數(shù)字的話,有效范圍之內(nèi)并不能容忍得下,超出的數(shù)據(jù)就會導(dǎo)致精度的丟失,故而以下解法是針對高精度計(jì)算問題,利用數(shù)組的每一個(gè)元素去模擬數(shù)值的位數(shù)。????
求2的N次方,N ≤ 10000
首先,我們應(yīng)該要把數(shù)字存儲倒序存儲到數(shù)組當(dāng)中,數(shù)值的
個(gè)位
放到數(shù)組a[0]
的位置,十位
放到數(shù)組a[1]
的位置,百位
放到數(shù)組a[2]
的位置……依次類推,為什么要倒序存儲呢,因?yàn)槲覀冃枰獙?shù)值進(jìn)行運(yùn)算,比如說如果將12345678912345正序存儲,將這個(gè)數(shù)值乘上2,那么可能會涉及到進(jìn)位運(yùn)算,如果進(jìn)位到最高位之后還需要進(jìn)1,那么此時(shí)數(shù)組a[0]的位置就不容易修改了,所以我們將最低位放到數(shù)組首元素位置。
??
實(shí)現(xiàn)思路:
??注:為了方便理解,我們暫時(shí)將畫圖中給定的數(shù)值為 12345678912345
。本題的實(shí)現(xiàn),注意數(shù)組初始化必須為1,才能保證求2的N次冪得到想要的結(jié)果。
首先將2N轉(zhuǎn)換為一共有多少位,取以10為底的對數(shù),即 log102N,轉(zhuǎn)換為N * log102 ,題目要求N最多取10000,換算大概3010多位,因?yàn)榭隙ê羞M(jìn)位,所以我們將數(shù)組的大小定義為3100個(gè),從數(shù)組的a[0]位置模擬個(gè)位,a[1]位置模擬十位……開始計(jì)算,我們需要將數(shù)組的元素初始化為1,因?yàn)?乘以任何數(shù)都是任何數(shù)。然后用t來存儲當(dāng)前數(shù)值是否需要進(jìn)行進(jìn)位,如果是進(jìn)位的話需要加到下個(gè)數(shù)值里面去,所以我們寫成
t += a[j] * 2;
然后將取模運(yùn)算得下的個(gè)位數(shù),放到b數(shù)組對應(yīng)的位置(實(shí)現(xiàn)時(shí),我們不需要開辟b數(shù)組,直接對a數(shù)組進(jìn)行覆蓋即可,這里方便理解,所以放到b數(shù)組之中),再繼續(xù)運(yùn)算,上一位進(jìn)位的t
加上本次a數(shù)組對應(yīng)的值乘上2 依然能夠整除10,那么結(jié)果為1,就表示進(jìn)位,再給到t
,否則為0,表示不進(jìn)位。……以此類推,最后為了保證數(shù)組的有效個(gè)數(shù)的位置,我們用m
來記錄,一旦每次乘以2之后,t
進(jìn)位為1,就讓m++
。最后輸出數(shù)組中的值,我們就要倒過來輸出,我們從m - 1的位置一直輸出的0即可,因?yàn)?code>m++是后置的,多加了一次,所以m
需要減去1。
代碼實(shí)現(xiàn):
????文章來源:http://www.zghlxwxcb.cn/news/detail-497662.html
#include <iostream>
const int N = 3300;
using namespace std;
int main() {
// 最低為數(shù)字是1,因?yàn)樗艘匀魏螖?shù)都是任何數(shù)
int a[N] = {1};
int n;
cin >> n;
//m標(biāo)記進(jìn)位完后的位置
int m = 1;
// 輸入的 n 是 2 的冪次,并非乘數(shù)
for (int i = 0; i < n; i++) {
int t = 0;
// 循環(huán)內(nèi)的數(shù)字從低位不斷被取出,這些數(shù)字都從左到右存放,也就是個(gè)位數(shù)在最左端,每次從數(shù)組a中讀取個(gè)位十位,分別與 2 相乘
// 運(yùn)算后把數(shù)字存回原數(shù)組
for (int j = 0; j < m; j++) {
t += a[j] * 2;
a[j] = t % 10;
t /= 10;
}
// 負(fù)責(zé)進(jìn)位,for循環(huán)最后一個(gè)操作是 t / 10,由于乘以2,最大為19, 因此若商為1,必定進(jìn)位1
if (t) a[m++] = 1;
}
//m多加了1次,減去1
for (int i = m - 1; i >= 0; i--) cout << a[i];
return 0;
}
測試結(jié)果
輸入10000,210000的結(jié)果如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-497662.html
到了這里,關(guān)于求2的N次冪(C++)解決高精度運(yùn)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!