Re: [問題] 大數加法的問題

看板C_and_CPP作者 ( )時間14年前 (2010/06/18 12:46), 編輯推噓2(201)
留言3則, 1人參與, 最新討論串2/5 (看更多)
※ 引述《BlackZap (Zap)》之銘言: : ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) : ( 未必需要依照此格式,文章條理清楚即可 ) : 遇到的問題: (題意請描述清楚) : 程式沒有做計算 : 希望得到的正確結果: : 第一個數跟第二個數能正確相加(100位) : 程式跑出來的錯誤結果: : 沒有做計算 : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : devc++ : 有問題的code: (請善用置底文標色功能) : #include <stdio.h> : #include <stdlib.h> : void main(void) ^^^ 你最後既然要return 0; 這就要改成 int main(void) : { : char A1[100]="012345678901234567890123456789"; : char A2[100]="012345678901234567890123456789"; : int dada1[100]; : int dada2[100]; : char dada3[101]; : int i; : int j; : int k; /* *************** * char to int * *************** */ : for(i=0;i<100;i++) : { : if(A1[i]!=0) : dada1[i]=A1[i]-48; : else : dada1[i]=0; : } : for(j=0;j<100;j++) : { : if(A2[j]!=0) : dada2[j]=A2[j]-48; : else : dada2[j]=0; : } /* ******* * ADD * ******* */ : *[1;36m for(k=0;k<100;k++) *[m : { : *[1;36m dada3[k]=((dada1[k]+dada2[k]+(dada1[k+1]+dada2[k+1]))/10); *[m : } : //printf("A1:%d\n",A1[k]); : //printf("dada2:%d\n",dada2[k]); : //printf("dada3:%d\n",dada3[k]); : printf("%d\n",dada3[10]); : system("PAUSE"); : return 0; : } : 補充說明: char to int: 關於你的這段轉換 轉換的結果 在dada裡面會是 ==>0123456789000000000000000...0000000000000000000000(共一百位) 基本上 你有兩種方式可以處理這個大數問題 一個是(A)靠左對齊 (B)靠右對齊 我個人視覺的靠右對齊比較好 因為"靠左對齊"需要額外去處理溢位的問題 換句話說 我建議你的0123456789應該是這樣 ==>00000000000...00000000000012345678901234567890123456789 (共一百位) 至於寫法 我自己寫了一個 你用Dev請加上system("PAUSE"); #include<stdio.h> #include<string.h> #define LEN 5 int main(void) { char cInput1[LEN]; int iInput1[LEN]; int iLength,iHelp; scanf("%s",cInput1);//讀入字串也就是你的123456789... iLength=strlen(cInput1);//iLength=長度 假設你輸入123 那麼iLength=3 //printf("Len=%d\n",iLength); //這裡是輸出 你可以自己打開來玩 //清除資料 這是使用變數前的好習慣 感覺你還剛開始 養成好習慣的話對將來有幫助 for(iHelp=0;iHelp<LEN;iHelp++) iInput1[iHelp]=0; //這裡是我的char到int轉換的重點 for(iHelp=1;iHelp<=iLength;iHelp++) iInput1[LEN-iHelp]=(int)(cInput1[iLength-iHelp]-'0'); /* iHelp表示目前處理了幾個位數 我的作法是由右到左 當iHelp=1 iInput[4] = cInput[iLength-1] 也就是說 我把iInpute的最後一位 放上了字串的最後一個字母 (因為cInput[iLength]=結束符號\0 所以要-1) 假設我輸入123 那麼iLength=3 所以iInput[4]=3; iInput[3]=2; iInput[2]=1; iInput[1]=0;//因為剛剛有初始化 所以沒有定義的位數會自己預設為0 iInput[0]=0; */ //最後輸出 for(iHelp=0;iHelp<LEN;iHelp++) printf("%d",iInput1[iHelp]); return 0; } ADD: 加法很簡單 你的寫法 可能是配合你的輸入 我有點不清楚 你的0是最高位還是..個位數 for(iHelp=LEN-1;iHelp>=0;iHelp--) { SUM[iHelp]=SUM[iHelp]+N1[iHelp]+N2[iHelp]%10; SUM[iHelp-1]=SUM[iHelp]+N1[iHelp]+N2[iHelp]/10; /* N1,N2分別為加數還有被加數 SUM為和 也就是說 SUM[4]=N1[4]+N2[4]%10; %是取餘數的意思 7%2=1 因為餘數是1 剩下的你應該要看得懂 就讓你自己想一想 */ } 補充說明: 這個程式有很多地方都可以作最佳化 你可以試著想一想我們小學是怎麼學加法算術的 9 8 7 6 + 5 6 7 ----------------- 3 ( 因為 (6+7)%10=3 ) 4 3 ( 因為 (6+7)/10+7+6=14 ) 不會有小數因為你宣告int 我們是不是會靠右對齊 然後我們的加法最多只會作四次 因為9876是四位數 所以最多四次 換句話說加法迴圈的次數可以在改善成為 兩個數(加數與被加數)較長得那一個的位數 這裡你可以想想要怎麼寫才會寫得更好. #define LEN是讓你定義 字串的長度 你可以填100 這裡為了方便說明我只寫5 如果對這裡的說明有問題歡迎你提問 但是記得發問前想一想. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.226.245

06/18 13:21, , 1F
先謝謝原PO幫忙
06/18 13:21, 1F

06/18 13:23, , 2F
加法那邊 我原本不是寫那樣 算式是對的 可是dada3就是印
06/18 13:23, 2F

06/18 13:24, , 3F
不出來 所以我就先簡化算式 後來PO上來時忘了補回去抱歉
06/18 13:24, 3F
文章代碼(AID): #1C6lebSt (C_and_CPP)
文章代碼(AID): #1C6lebSt (C_and_CPP)