高精度演算法

2021-09-02 04:12:25 字數 3971 閱讀 6654

由於計算機在計算位數超過十幾位的數時,不能採用現有型別,只能自己程式設計計算。

高精度計算通用方法:

高精度計算時一般用乙個陣列來儲存乙個數,陣列的乙個元素對應於數的一位(當然,在以後的學習中為了加快計算速度,也可用陣列的乙個元素表示數的多位數字,暫時不講),表示時,由於數計算時可能要進製,因此為了方便,將數由低位到高位依次存在陣列下標對應由低到高位置上,另外,我們申請陣列大小時,一般考慮了最大的情況,在很多情況下,表示有富餘,即高位有很多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 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;

}

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

二.高精度數比較

int compare(int a,int b)   //比較a和b的大小關係,若a>b則為1,ab[0]) return 1;//a的位數大於b則a比b大

if (a[0]0;i--) //從高位到低位比較

四、高精度減法

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

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

if(flag==1) //大於

//單獨處理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;

}

六、 高精度除以低精度;

演算法:按照從高位到低位的順序,逐位相除。在除到第j位時,該位在接受了來自第j+1位的餘數後與除數相除,如果最高位為零,則商的長度減一。源程式如下:

#include  #define   n  500

main()

, c[n] = ;

char a1[n];

printf("input 除數:");

printf("input 被除數:");

scanf("%s", a1);

k = strlen(a1);

for(i = 0; i < k; i++) a[i] = a1[k - i - 1] - '0';

d = 0;

for(i = k - 1; i >= 0 ; i--)

while(c[k - 1] == 0 && k > 1) k--;

printf("商=");

printf("\n餘數=%d", d);

}

七、高精度乘以高精度(要求用盡可能少的儲存單元);

演算法:用陣列儲存兩個高精度數,然後逐位相乘,注意考慮進製和總位數。源程式如下:

#include  main()

, b[240] = , c[480] = ;

int i, j, ka, kb, k;

char a1[240], b1[240];

gets(a1);

ka = strlen(a1);

gets(b1);

kb = strlen(b1);

k = ka + kb;

for(i = 0; i < ka; i++) a[i] = a1[ka-i-1] - '0';

for(i = 0; i < kb; i++) b[i] = b1[kb-i-1] - '0';

for(i = 0; i < ka; i++)

for(j = 0; j < kb; j++)

if(!c[k]) k--;

for(i = k-1; i >= 0; i--) printf("%d", c[i]);

}

六、高精度除於高精度

基本的思想是反覆做減法,看看從被除數裡最多能減去多少個除數,商就是多少。乙個乙個減顯然太慢,如何減得更快一些呢?

以7546除以23為例來看一下:

開始商為0。先減去23的100倍,就是2300,發現夠減3次,餘下646。於是商的值就增加300。

然後用646減去230,發現夠減2次,餘下186,於是商的值增加20。

最後用186減去23,夠減8次,因此最終商就是328。

所以本題的核心是要寫乙個大整數的減法函式,然後反覆呼叫該函式進行減法操作。計算除數的10倍、100倍的時候,不用做乘法,直接在除數後面補0即可。

#include#include#include#include #define maxlen 200

using namespace std;

//函式substract功能:

//用長度為len1的大整數p1減去長度為len2的大整數p2

// 結果存在p1中,返回值代表結果的長度

//不夠減 返回-1 正好夠 返回0

int substract( int *p1, int *p2, int len1, int len2 )

}for( i=0; i<=len1-1; i++ ) //從低位開始做減法

}for( i=len1-1; i>=0; i-- ) //查詢結果的最高位

if( p1[i] ) //最高位第乙個不為0

return (i+1); //得到位數並返回

return 0; //兩數相等的時候返回0

}int main()

ntimes = len1 - len2; //相差位數

for ( i=len1-1; i>=0; i-- ) //將除數擴大,使得除數和被除數字數相等

len2 = len1;

for( j=0; j<=ntimes; j++ ) //重複呼叫,同時記錄減成功的次數,即為商

}//輸出結果

for( i=maxlen-1; num_c[i]==0 && i>=0; i-- );//跳過高位0

if( i>=0 )

for( ; i>=0; i-- )

printf("%d", num_c[i]);

else

printf("0");

printf("\n");

}return 0;

}

演算法 高精度乘法2(高精度乘高精度)

題目描述 高精度乘,求兩個很大的非負整數相乘的結果。輸入 2個非負整數,每個一行,每個整數不超過240位。輸出 乙個整數,表示相乘的結果。例子 為了和演算法對應方便,用上面數乘下面數的方法12 5 2512 5502 5312 5為了運算方便,將上面兩數倒置,得到的結果也為倒序下標0 1234 56...

高精度演算法 791 高精度加法

給定兩個正整數,計算它們的和。輸入格式 共兩行,每行包含乙個整數。輸出格式 共一行,包含所求的和。資料範圍 1 整數長度 100000 輸入樣例 1223 輸出樣例 35注意點 1.兩個整數較大,用字串來存,這樣的話,可以呼叫它的size 方法 2.將兩個大的整數,存入vector陣列中,最好把整數...

高精度演算法

任務 高精度,計算大數乘小數 引數 乘法函式mul引數為 被乘數a,儲存最終結果的ans陣列,乘數b 結果 ans陣列中ans 0 為最高位,以此類推 include include using namespace std void mul char a,char ans,int b 任務 高精度,...