問題描述
計算機所能完成的一個基本功能就是完成數據的計算,譬如加法、減法等等。但是在任何一種計算機上,計算中能夠使用的數字都是有一定范圍的,超過了范圍,就沒法得到精確的結果。
你現在接受了一個任務,要編寫一個高精度計算器的核心部分。所謂高精度計算器,就是可以計算很大很大的數據的計算器。而你所需要編寫的程序,就是真正完成高精度加法和高精度減法運算的兩個函數,因為程序其它的部分已經由別人編寫好了。
函數的輸入、輸出接口也已經定義完成,譬如 plus() 函數,它有三個參數 a、b 和 c,都是 char * 類型。a 和 b 分別是參加運算的兩個整數,而 c 用來存放運算的結果。所有的數字都是以字符串的形式保存的。
注意,只需提交你自己編寫的兩個函數。
輸入的每一行是兩個十進制的正整數和一個運算符,每個整數可以由最多 500 個數字組成。運算符可以是加號或者減號。
對應著輸入的每一行數據,輸出計算的結果,每個結果占一行。
大致思路:
我用的思路是,先將a,b兩個字符串倒序轉化為整形數組,然後模擬加減法的豎式計算通過數組之間的“進位”來將最後的結果存入一個整形數組裡面,最後再把這個整形數組轉化為字符型的數組。
具體實現方式以及需要注意的事項:
首先預制的函數裡面在輸入中多了“/n”,這個我們在自己編寫的時候可以先將其去掉,要不然讀入的時候會有問題。
然後就是進行字符串的轉化,需要注意的是需要先把字符串前面的前導0去掉,借用大神的方法while(a[0]=='0')a++;while(b[0]=='0')b++;這樣就可以吧字符串前面的前導0去掉。但是應該注意字符串a=“0000”或b=“00000”的這種情況,這種情況下會導致,把字符串清空,這裡需要判斷一下,如果經過上面的處理之後字符串的長度為0,我們就可以人為的令字符串的長度為1,a[0]=0,b[0]=0.然後進行轉化,轉化的時候一般有兩種方法比較容易想到一是在後面-‘0’,另一種是在後面-48,不過看發帖說‘0’-‘0’=‘\0’(自己理解是因為兩個字符是一樣的,所以減完之後就是空了),所以還是用第二種方法進行倒序的轉換。這裡對於減法需要注意,為了是最後的‘-’比較好處理,所以我們要用大數減去小數,在做轉換的時候,如果a(可以再轉化數組的時候將大的數組放進規定的放大數的數組裡,並做好標記;也可以直接轉化,然後在減的時候用表示大數的數組減去表示小數的數組,並做標記)。注意在每次調用函數的時候都要將自己定義的三個整形數組清0.
然後就是計算了,對於加法,按照豎式計算的順序每一位的兩個數相加,相加的結果存入c[i]裡面,如果c[i]>9,則c[i+1]++;c[i]+=10;這樣循環著計算(循環的長度是兩個數組裡面最長的數組的長度),最後計算完了之後要判斷c[length](length表示兩個數組裡面最長的數組的長度)是否等於1,即判斷最高位是否有進位,如果有那麼length++。對於減法,思路和加法一樣,按照豎式計算的順序每一位的兩個數相減,相減的結果存入c[i]裡面,如果如果c[i]<0,則c[i+1] - -;c[i]+=10;這樣循環著計算(循環的長度是兩個數組裡面最長的數組的長度),最後計算完了之後要判斷數組a的前面(length表示兩個數組裡面最長的數組的長度)是否有等於0的位,即判斷前面的位是否被借走,剩下0,如果是那麼length--,終止的條件是c[length--]!=0(就是所說的退位)。
最後就是將整形數組c中的數字轉換為字符串,即每個位上的數+48.要注意減法中如果最後的結果是負數的時候要在數組的前面加‘-’,因為最後是‘%s’輸出的,所以可以領cc[0]=’-’.還要注意在轉換完成的時候要在字符數組的最後加上‘\0’,這樣可以防止由於數組沒有初始化而導致輸出亂碼。
實現代碼
void plus(char *a, char *b, char *c) { int lengtha,lengthb,length; int i,j; int aa[505],bb[505],cc[505]; for(i=0;i<505;i++) { aa[i]=0; bb[i]=0; cc[i]=0; } while(a[0]=='0')a++; while(b[0]=='0')b++; lengtha=strlen(a); lengthb=strlen(b); if(lengtha==0&&lengthb!=0) { length=lengthb; aa[0]=0; } else if(lengtha!=0&&lengthb==0) { length=lengtha; bb[0]=0; } else if(lengtha==0&&lengthb==0) { length=1; aa[0]=0; bb[0]=0; } else if(lengtha>lengthb) { length=lengtha; //找出最長的數 } else { length=lengthb; } for(i=0;i9) //計算 { cc[i+1]++; cc[i]-=10; } } if(cc[length]>0) { length++; } for(j=0;j lengtha) { length=lengthb; temp=1; } else { length=lengtha; } if(temp!=0) { for(i=0;i 0) { length--; } length++; if(temp==0) { for(i=0;i