大數加法分析及C語言實現(加數可為負數)

2021-09-03 01:16:04 字數 3465 閱讀 7674

大數加法有如下幾種情況:

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...