大數加法有如下幾種情況:
1.兩數同號
(1)同正:如,s1=11,s2=22;s1=0,s2=0
(2)同負:如,s1=-11,s2=-22
2.兩數異號
(1)正數加負數:如,s1=11,s2=-9
1)s1的長度大於s2絕對值的長度:如,s1=11,s2=-9
2)s1和s2絕對值的長度相等但s1大於等於s2的絕對值:s1=106,s2=-104;s1=11,s2=-11
3)s1的長度小於s2絕對值的長度:如,s1=9,s2=-11
2)s1和s2絕對值的長度相等但s1小於s2的絕對值:s1=104,s2=-106
(2)負數加正數:如,s1=-9,s2=11
位置轉換可變換為「正數加負數」形式
首先,將大數以字串形式輸入
其次,判斷s1與s2符號,呼叫不同函式處理
(1)同號:呼叫plus函式
1)如果同正,設定標誌結果符號的flag為0,將兩個字串轉化為陣列形式倒序儲存
2)如果同負,設定標誌結果符號的flag為1,將兩個字串轉化為陣列形式倒序儲存,但不儲存兩字串的第0位(因為第0位為負號)
3)將兩陣列對應位相加,位數滿10進1
4)根據flag值輸出結果的符號
5)判斷最高位是否為0,輸出結果陣列
(2)異號:呼叫minus函式
1)呼叫函式時以正數-負數順序傳遞實參給形參,即s1為正數,s2為負數
2)將兩個字串轉化為陣列形式倒序儲存,但不儲存s2字串的第0位(因為s2[0]為負號)
3)判斷結果符號,根據兩數大小,有兩種情況:
1)s1的長度大於s2的長度或s1和s2長度相等但s1大於等於s2,即:
len1>(len2-1) 或 len1==(len2-1),s1>=s2 做num1-num2,設定flag=0,標誌得正數
2)s1的長度小於s2的長度或s1和s2長度相等但s1小於s2,即:
len1<(len2-1)或 len1==(len2-1),s1
#include
#include
char s1[
10005
],s2[
10005
],s3[
10005];
int num1[
10005
],num2[
10005];
int len1,len2,i,j;
//當s1與s2同號,利用flag標誌結果的符號(0為正,1為負)
void
plus
(int flag)
for(i=len2-
1,j=
0; i>=
0; i--
)//計算兩字串長度最大值作為和的長度
int len;
if(flag==
0) len=len2>len1?len2:len1;
else len=len2>len1?
(len2-1)
:(len1-1)
;//如果s1與s2同負,flag=1,len值應為長度減1
//進行加計算及進製
for(i=
0; i//輸出符號位
if(flag==1)
printf
("-");
//如果s1與s2同負,flag=1,結果的符號位為負
//輸出結果
if(num1[i]
)//最高位進製
else
//最高位未進製
}//對異號的s1和s2處理成「大數-小數」形式後呼叫該函式進行減計算並顯示,利用flag標誌結果的符號(0為正,1為負)
void
minus_show
(int flag,
int len,
int num1,
int num2)
else
}//輸出過濾掉結果前面無效的0
while
(num1[
--i]==0
)//輸出符號位
if(flag==1)
printf
("-");
//flag=1,結果的符號位為負
//輸出結果
for(j=i; j>=
0; j--
)printf
("%d"
,num1[j]);
printf
("\n");
}//當s1與s2異號,以正數-負數順序傳遞實參給形參
void
minus
(char s1,
char s2)
for(i=len2-
1,j=
0; i>
0; i--
)//s2為負數,s2[0]為符號位,不要
memset
(s3,0,
sizeof
(s3));
//為了便於比較同長度下的兩個數的大小,將去掉負號的s2賦值給s3
for(i=
1,j=
0; i)// 對應計算例子:(1)s1=11,s2=-9 ;(2)s1=106,s2=-104;(3)s1=11,s2=-11
//len1>(len2-1) 或 len1==(len2-1),s1>=s2 做num1-num2,設定flag=0,標誌得正數
if(len1>
(len2-1)
||(len1==
(len2-1)
&&strcmp
(s1,s3)==0
)||len1==
(len2-1)
&&strcmp
(s1,s3)==1
)//對應計算例子:(1)s1=9,s2=-11 ;(2)s1=104,s2=-106
//(len2-1)>len1 或 len1==(len2-1),s1elseif(
(len2-1)
>len1||
(len1==
(len2-1)
&&strcmp
(s1,s3)==-
1))}
intmain()
//對應計算例子:(1)s1=-11,s2=-22
else
if(s1[0]
=='-'
&&s2[0]
=='-'
)//對應計算例子:s1=11,s2=-9
else
if(s1[0]
!='-'
&&s2[0]
=='-'
)//對應計算例子:s1=-9,s2=11
else
}return0;
}
c語言實現大數相加
文章 兩個大數我們可以用陣列來儲存,然後在陣列中逐位進行相加,再判斷該位相加後是否需要進製,為了方便計算,我們將數字的低位放在陣列的前面,高位放在後面。捕獲.jpg include includeint main n2 10000 int result 10001 t1 10000 t2 10000...
陣列形式的加法 C語言實現
前言 一道比較有意思的題。要求利用陣列儲存數字來完成加法運算。對於非負整數 a 而言,a的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 x 1231,那麼其陣列形式為 1,2,3,1 在遇到需要儲存很大的數字的時候,利用陣列來完成計算是乙個很巧妙的想法。實現思路 首先乙個取巧的思路,將陣...
C語言實現超大數相加
思路 不考慮輸入非法的情況 超大數無法使用char int float double進行資料儲存,所以使用陣列進行資料儲存,且資料為ascii碼的形式 include include include define max 256 define carry flag 9 1 將輸入的大數存放起來 vo...