C 之高精度算發

2021-08-26 18:29:47 字數 2126 閱讀 8590

前言:由於計算機運算是有模運算,資料範圍的表示有一定限制,如整型int(c++中int 與long相同)表達範圍是(-2^31~2^31-1),unsigned long(無符號整數)是(0~2^32-1),都約為幾十億.如果採用實數型,則能儲存最大的double只能提供15~16位的有效數字,即只能精確表達數百萬億的數.因此,在計算位數超過十幾位的數時,不能採用現有型別,只能自己程式設計計算.

高精度計算通用方法:高精度計算時一般用乙個陣列來儲存乙個數,陣列的乙個元素對應於數的一位(當然,在以後的學習中為了加快計算速度,也可用陣列的乙個元素表示數的多位數字,暫時不講),表示時,由於數計算時可能要進製,因此為了方便,將數由低位到高位依次存在陣列下標對應由低到高位置上,另外,我們申請陣列大小時,一般考慮了最大的情況,在很多情況下,表示有富餘,即高位有很多0,可能造成無效的運算和判斷,因此,我們一般將陣列的第0個下標對應位置來儲存該數的位數.如數:3485(三千四百八十五),表達在陣列a[10]上情況是:

下標  0 

1  2 

3 4   

5 6 

7 8 

9 內容  4 

5 8 

4 3 

0 0 

0 0 

0說明:位數 

個位 十位 

百位 千位

具體在計算加減乘除時方法就是小學時採用的列豎式方法.

注:高精度計算時一般用正數,對於負數,通過處理符號位的修正.

一.高精度數的儲存

1.如對數採用的字串輸入

#include

#include

#include

using namespace std;

const int n=100;//最多100位

int main()

2.直接讀入

#include

using namespace std;

const int n=100;//最多100位

int main()

a[0]=i; //共i位數

return 0;

}3.直接初始化(用a儲存)

初始化為0: memset(a,0,sizeof(a));

初始化為1: memset(a,0,sizeof(a

));a[0]=1;a[1]=1;

以下程式都只寫函式,不寫完整程式,所有高精度數儲存都滿足上述約定。

二.高精度數比較

int compare(int a,int b) 

//比較a和b的大小關係,若a>b則為1,a

三、高精度加法

int plus(int a,int b) //計算a=a+b

//計算當前位數字,注意:這條語句與上一條不能交換。

if(a[k+1]>0) a[0]=k+1; 

//修正新的a的位數(a+b最多只能的乙個進製)

else a[0]=k;

return 0;

}四、高精度減法

int gminus(int a,int b);//計算a=a-b,返加符號位0:正數 1:負數

//若a=b,則a=0,也可在return前加一句a[0]=1,表示是 1位數0

if(flag==1) //大於 

while(a[a[0]]==0) a[0]--; //修正a的位數

return 0;}

if (flag==-1)//小於 

則用a=b-a,返回-1

a[0]=b[0];

while(a[a[0]]==0) a[0]--; //修正a的位數

return -1;}

}五、高精度乘法1(高精度乘單精度數,單精度數是指通常的整型數)

int multi1(int a,long 

key) //a=a*key,key是單精度數 

//單獨處理key=0

for(i=1;i<=a[0];i++)a[i]=a[i]*key;//先每位乘起來

for(i=1;i<=a[0];i++) //進製

//注意上一語句退出時i=a[0]+1

while(a[i]>0)  

//繼續處理超過原a[0]位數的進製,修正a的位數

return 0;

}int multi2(int a,int b) //a=a*b

C 資料結構之高精度整數

當我們遇到一些數值非常巨大的整數以至於我們不能用任何一種資料型別來儲存他的值,這個時候我們要考慮使用乙個結構體來儲存這個整數,並完成對其運算的實現。1.實現乙個加法器。使其能夠輸出a b的值 輸入包括兩個數a和b,並且都不超過1000位,輸出a b的值 樣例輸入 2 610000000000 100...

數學之高精度(續)於2020 7 29

考點 高精度加法 注意輸出格式,輸出錯誤三次 沒好好看題 考點 實數的高精度冪 說真的這有點坑人,因為沒想過寫實數的高精度 你把double放哪兒了 找到的題解裡重新定義了大實數的結構體,現場寫也不是不可以,但是恐怕會花很長很長時間 憑我的編碼水平寫這麼大 量 考點 大數比較 套模板卡了很久!是因為...

基本演算法之高精度計算c c 實現

void init int a 接收時往往是用字串的,所以它的位數就等於字串的長度。c i a i b i if c i 10 if a i b i c i a i b i i和j從1開始迴圈 c i j 1 a i b i x c i j 1 當前乘積 進製 原數 x c i j 1 10 記錄 ...