高精度整數的 , ,

2021-10-04 18:46:26 字數 3222 閱讀 9040

高精度整數加法問題

求兩個整數,a和b的和,(0=思路

這就需要回想起小學我們學的加減法了,借位(-)與進製(+)問題,分三個步驟來求解:

1.處理輸入:用兩個字元陣列來儲存a和b,ans陣列表示最終答案

2.運算過程:遍歷兩個字元陣列,算出結果的每一位數,ans[i]+=a[i]+b[i]-2*『0』(這裡要分開+,如果不分開+會出現意想不到的結果哦,分開加是為了避免加到的是-『0』而不是0,會影響起結果);

如果ans[i]>9,則進製(ans[i+1]++,ans[i]%=10)

3.處理輸出:輸出要注意的就是答案不包含前導0的情況。

**

#include

#include

#include

using

namespace std;

const

int maxn=

505;

char a[maxn]

,b[maxn]

;int ans[maxn]

;int

main()

}if(ans[n]!=0

)printf

("%d"

,ans[n]);

for(

int i=n-

1;i>=

0;i--

)printf

("%d"

,ans[i]);

return0;

}

高精度整數減法問題

求兩個整數 a,b的差(第二個可能比第乙個大,0=思路

1.處理輸入:輸入兩個字串,我們後期算的時候就用大的數減小的數

這裡尤其關鍵,舉個例子234-345=?

234

-345

=-289

這是我算的,哈哈,我都不知道是怎麼算的,最高位不夠減我是怎麼借來的,當時估摸著不對啊,口算也是-111啊,怎麼就算到-289了,就發現問題所在了,我們只需要處理輸入,每次將大的數賦給a,小的給b,然後用a-b來算,然後做個標記,如果交換則,最後輸出乙個負號即可,判斷大小具體在**裡面。

2.運算過程:遍歷兩個字元陣列,算出結果的每一位數,

ans[i]-=a[i]+b[i]-2*『0』(這裡要分開-,如果不分開-會出現意想不到的結果哦,分開加是為了避免減到的是-『0』而不是0,會影響起結果);

如果ans[i]<0,則借位(ans[i+1]–,ans[i]+=10)

3.處理輸出:還是前導0的情況。

**

#include

#include

#include

using

namespace std;

const

int maxn=

10086+5

;char a[maxn]

,b[maxn]

;int ans[maxn]

;int

main()

lena=

strlen

(a);

lenb=

strlen

(b);

reverse

(a,a+lena)

;reverse

(b,b+lenb)

;for

(int i=

0;iint i=lena-1;

if(flag)

printf

("-");

while

(ans[i]==0

&&i>

0) i--

;//這裡要留個位給最後的輸出,萬一等於0呢。

for(

int j=i;j>=

0;j--

)printf

("%d"

,ans[j]);

return0;

}

高精度整數乘法問題

求兩數的積。(0=思路

1.處理輸入:用兩個字元陣列來儲存a和b,ans陣列表示最終答案;

2.運算過程:還是小學知識

999

* 99

=98901

我們先算999* 9,其原理和加法類似(ans[j]+=(a[j]-『0』)(b[i]-『0』)),如果ans[j]>9,則還是加到高一位去ans[j+1]=ans[j]/10;ans[j]%=10,然後算90 * 999=>9 999*10,我們可以這樣處理,a陣列遍歷完一次了過後,則最低位加一位,然後繼續進行乘法操作;

3.處理輸出:前導0。

**:

#include

#include

#include

using

namespace std;

const

int maxn=

2e3+5;

char a[maxn]

,b[maxn]

;int ans[maxn<<1]

;int

main()

} k++;}

int i=lena+lenb-1;

while

(ans[i]==0

&&i>

0) i--

;//a*b最大lena+lenb位數,最小lena+lenb-1位數

for(

int j=i;j>=

0;j--

)printf

("%d"

,ans[j]);

return0;

}

當然,具體問題具體分析,假如a和b包含負數加一些判斷即可,下面的絕對值可不是真正的絕對值,只是去掉-,將原陣列拷貝到新陣列中:

1.a+b:

a>0,b<0=>a-|b|;

a<0,b>0=>b-|a|;

a<0,b<0=>-(|a|+|b|);

a>0,b>0=>a+b;

2.a-b:

a>0,b<0=>a+|b|;

a<0,b>0=>-(b+|a|);

a<0,b<0=>b-a;

a>0,b>0=>a-b;

3.a*b:

a>0,b<0=>-a * |b|;

a<0,b>0=>-b * |a|;

a<0,b<0=>|a| * |b|;

a>0,b>0=>a * b;

高精度整數運算

問題描述 編寫乙個程式,進行高精度整數的加 減 乘運算。輸入兩個十進位製大整數m和 n m n最長可達 50位 根據要求計算運算結果並輸出。輸入形式 標準輸入上依次分行輸入以下內容 1.第一行輸入第乙個大整數m。m可能帶有負號,後面是最長可達 50位的數字序列。2.第二行只有乙個字元,可以是 分別代...

高精度整數 5

題目1190 大整數排序 題目描述 對n個長度最長可達到1000的數進行排序。輸入 輸入第一行為乙個整數n,1 n 100 接下來的n行每行有乙個數,數的長度範圍為1 len 1000。每個數都是乙個正數,並且保證不包含字首零。輸出 可能有多組測試資料,對於每組資料,將給出的n個數從小到大進行排序,...

高精度整數 6

題目1208 10進製 vs 2進製 題目描述 對於乙個十進位制數a,將a轉換為二進位制數,然後按位逆序排列,再轉換為十進位制數b,我們乘b為a的二進位制逆序數。例如對於十進位制數173,它的二進位制形式為10101101,逆序排列得到10110101,其十進位制數為181,181即為173的二進位...