高精度整數加法問題
求兩個整數,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=?
這是我算的,哈哈,我都不知道是怎麼算的,最高位不夠減我是怎麼借來的,當時估摸著不對啊,口算也是-111啊,怎麼就算到-289了,就發現問題所在了,我們只需要處理輸入,每次將大的數賦給a,小的給b,然後用a-b來算,然後做個標記,如果交換則,最後輸出乙個負號即可,判斷大小具體在**裡面。234
-345
=-289
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* 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陣列遍歷完一次了過後,則最低位加一位,然後繼續進行乘法操作;999
* 99
=98901
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的二進位...