處理大數減法運算:
1、首先要判斷被減數與減數哪個更大,再相應的帶入減法函數去處理。具體的比較可以使用字串的相關知識去比較。
2、相減要先對齊數組,依照減數的長度,執行相應的減法運算次數。
3、不需要借位相減的話,直接減去;需要的話,向前借一位,若前一位是0,則再前借(此時前一位的0變為10)。
測試程式效果如下:
以下程式碼封裝括相減函數,比較被減數減數函數,若有錯誤,請指出:
#include "stdio.h"<br />#include "string.h"</p><p>/************************************************************************/<br />/* 高精度減法 (這個函數要a[]>=b[]) */<br />/* a[]被減數數組,位元不限 */<br />/* b[]減數數組,位元不限 */<br />/* back[]結果數組,位元不會大於a[]數組的 */<br />/************************************************************************/<br />void sub(char a[],char b[],char back[])<br />{<br />int i,k,l1,l2;<br />l1=strlen(a);<br />l2=strlen(b);<br />back[l1]='/0';<br />for (i=l2-1,l1--;i>=0;l1--,i--) //減數的個數小於等於被減數,所以減的次數依減數而定<br />{<br />if (a[l1]-b[i]>=0) //不需要借位相減<br />{<br />back[l1]=a[l1]-b[i]+'0';<br />}<br />else //向前一位借1<br />{<br />back[l1]=10+a[l1]-b[i]+'0';<br />if (a[l1-1]!='0') //當前一位非0,可以被借時,直接借來<br />{<br />a[l1-1]-=1;<br />}<br />else //若前一位為0,則無法借到,繼續向前一位的前一位借,迴圈<br />{<br />k=l1-1;<br />while (a[k]=='0')<br />{<br />a[k]='9'; //前一位的0,就變成了10,扣去被後一位借去的,還有9<br />k--;<br />}<br />a[k]-=1; //到達可以借的位置<br />}<br />}<br />}<br />while (l1>=0) //被減數多於減數的位元直接賦給結果數組<br />{<br />back[l1]=a[l1];<br />l1--;<br />}<br />while (back[0]=='0') //將結果數組往前移,方便以後的操作<br />{<br />l1=strlen(a);<br />for (i=0;i<l1-1;i++)<br />{<br />back[i]=back[i+1];<br />}<br />back[l1-1]='/0';<br />}<br />if (strlen(back)==0) //被減數與減數剛好相減為0的情況<br />{<br />back[0]='0';<br />back[1]='/0';<br />}<br />}</p><p>/************************************************************************/<br />/* 判斷函數(被減數與減數的大小比較) */<br />/* 可以用strcmp函數比較字串 */<br />/* 比較完後,若小於減數,則置換帶入高精度減法函數,最後加'-'輸出 */<br />/************************************************************************/<br />bool isBigger(char a[],char b[])<br />{<br />int l1,l2;<br />l1=strlen(a);<br />l2=strlen(b);<br />if (l1>l2)<br />{<br />return true;<br />}<br />else if (l1<l2)<br />{<br />return false;<br />}<br />else<br />{<br />if (strcmp(a,b)>=0)<br />{<br />return true;<br />}<br />else<br />{<br />return false;<br />}<br />}<br />}</p><p>/************************************************************************/<br />/* 主函數調用 */<br />/************************************************************************/<br />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 />if (isBigger(a,b))<br />{<br />sub(a,b,c);<br />printf("%s%s/n/n","結果為: ",c);<br />}<br />else<br />{<br />sub(b,a,c);<br />printf("%s%c%s/n/n","結果為: ",'-',c);<br />}<br />}<br />return 0;<br />}