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