實做加法的大數運算:
如果直接把讀到的數字做加法,需要考慮位數對應和擴增陣列大小的問題。
把所有讀到的數字反向,再做加法 => 位數直接對應,擴增大小只要往後面加數字即可。
輸出結果時,再反向回來即可。
注意:
1. 如果用 fgets 讀,會有 '\n',改用 scanf("%s") 可以避免這個問題。
2. 當新加的數字位數比目前的 sum 多,或是兩個數字相加後,超過目前的位數時,需要對
sum 擴增,因為 sum 擴增的那一位的值 0,跟原本兩個字元做相加的運算不同,所以要寫
判斷式處理。
ex :
num[10]={0};
假設現在 num 讀到 956 (第一個數字)
下一個數字為 956
659
+659
________
2191
↑ 在 num 裡原本的值是 0,如果依照前面字元 num[i]+= '9' - '0' + carry 的方法處理,
在 if( num[i] > '9' ) 判斷進位的地方會有問題,所以遇到原本的值為 0 時,直接把値
存進去 num[i] = carry + '0'
6
+05
________
65
↑ 這個情況也是,原本的值是 0,直接把直存進去 num[i] = num_tmp[i] + carry
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverNum(char number[]){
char tmp[150]={0};
int i,j;
for(i=strlen(number)-1,j=0;i>=0;i--,j++){
tmp[j]=number[i];
}
tmp[j]='\0';
for(i=0;tmp[i]!='\0';i++){
number[i]=tmp[i];
}
return;
}
int main(void){
char number[150]={0},number_tmp[150]={0},carry;
int i,top;
top=-1;
fgets(number,150-1,stdin);
number[strlen(number)-1]='\0';
reverNum(number);
while( fgets(number_tmp,150-1,stdin)!=NULL ){
if( strlen(number_tmp)==2 && number_tmp[0]=='0' ){
break;
}
number_tmp[strlen(number_tmp)-1]='\0';
reverNum(number_tmp);
carry=0;
for(i=0;number_tmp[i]!='\0';i++){
if(number[i]==0){
number[i] = number_tmp[i] + carry;
}else{
number[i] += (number_tmp[i]-'0') + carry;
}
if(number[i] > '9'){
carry=(number[i]-'0')/10;
number[i] = ( (number[i]-'0') % 10 ) + '0';
}else{
carry=0;
}
}
while(carry!=0){
if(number[i]==0){
number[i]=carry+'0';
}else{
number[i]+=carry;
}
if(number[i] > '9'){
carry=(number[i]-'0')/10;
number[i] = ( (number[i]-'0') % 10 ) + '0';
}else{
carry=0;
}
++i;
}
}
reverNum(number);
printf("%s\n",number);
return 0;
}
沒有留言:
張貼留言