Re: [問題] 大數加法的問題
※ 引述《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
06/18 13:21, 1F
推
06/18 13:23, , 2F
06/18 13:23, 2F
→
06/18 13:24, , 3F
06/18 13:24, 3F
討論串 (同標題文章)