處理大數加法:
1.用數組來儲存每位元,對每位元進行相加運算,要依加法原則,從低位開始運算。而數組是從高位開始儲存的,所以要逆序處理運算。要處理進位和當前位超9處理。
2.這裡的加法運算不包括負數計算,可以轉換為相關的減法運算。
測試程式效果如下:
一下程式碼封裝含相加函數,測試的主函數,相加函數(附帶注釋)直接可以使用:
#include "stdio.h"<br />#include "stdlib.h"<br />#include "string.h"<br />/************************************************************************/<br />/* 高精度加法運算*/<br />/* a[]被加數,位元不限*/<br />/* b[]加數,位元不限*/<br />/* back[]結果,字串儲存 */<br />/************************************************************************/<br />void add(char a[],char b[],char back[])<br />{<br />int i,j,k,up,x,y,z,l;<br />char *c;//儲存結果的逆數組<br />if (strlen(a)>strlen(b))//判斷位元哪個更大嗎,取較長的位元,以防進位要多補一位和結束符<br />{<br />l=strlen(a)+2;<br />}<br />else<br />{<br />l=strlen(b)+2;<br />}<br />c=(char *)malloc(l*sizeof(char));//動態開闢char類型l長度的字串<br />i=strlen(a)-1;//取實際長度<br />j=strlen(b)-1;<br />k=0;up=0;//k是c數組的下標,up代表進位標誌<br />while (i>=0 || j>=0)<br />{<br />if (i<0)//當被加數位元過少的話,用0前補不足<br />{<br />x='0';<br />}<br />else<br />{<br />x=a[i];<br />}<br />if (j<0)//當加數位元過少的話,用0前補不足<br />{<br />y='0';<br />}<br />else<br />{<br />y=b[j];<br />}<br />z=x-'0'+y-'0';//加法運算<br />if (up)//對上一次的進位處理<br />{<br />z+=1;<br />}<br />if (z>9)//超9處理<br />{<br />up=1;<br />z%=10;<br />}<br />else<br />{<br />up=0;<br />}<br />c[k++]=z+'0';//存入c數組<br />i--;<br />j--;<br />}<br />if (up)//末次進位情況<br />{<br />c[k++]='1';<br />}<br />c[k]='/0';//結束符<br />for (k-=1,i=0;k>=0;k--)//數組逆序賦給back結果數組<br />{<br />back[i++]=c[k];<br />}<br />back[i]='/0';<br />}</p><p>int main()<br />{<br />int n;<br />char a[1000],b[1000],c[1000];<br />printf("%s","計算次數: ");<br />scanf("%d",&n);<br />while (n--)<br />{<br />memset(a,'/0',sizeof(a));<br />memset(b,'/0',sizeof(b));<br />memset(c,'/0',sizeof(c));<br />printf("%s","請輸入被加數: ");<br />scanf("%s",&a);<br />printf("%s","請輸入加數: ");<br />scanf("%s",&b);<br />add(a,b,c);<br />printf("%s%s/n/n","加法後結果為: ",c);<br />}<br />return 0;<br />}