這幾天無聊,突然想起來,大學當時有個問題困擾著我
兩個超大的數怎麼儲存和相加呢,計算機的整形32位的最大也就4294967296,超過這個數就計算不了了哇
然後就想動手實踐一下
思路:1.超長資料怎麼存呢。腦子一拍,巨長的數肯定用字元陣列來存哇,沒毛病。
2.要怎麼運算呢。我想的是,乙個數最大是4294967296,長度為10,那我兩個9長度的資料相加,肯定不會超過1999999998,那我就把巨長的字元陣列每九個切割成整形陣列儲存起來唄,這樣就可以相加了。比如111111111222222222+3333333333444444444轉化為111111111+3333333333和222222222+444444444然後把兩個結果湊一起就成啦
3.嗯,這樣的思路看起來沒毛病,挺簡單的。(mdzz,對自己豎中指,真蠢的辦法,**寫一半想到了更簡單的方法,結尾說說)。那就動手吧。
**:ps:**有點長,沒辦法,太傻了,寫起來才發現,這種方法要考慮好多種情況,比如連續進製,兩個資料不等長等等
#include//將字元資料轉換成int型別資料,9個長度的為乙個資料,呼叫atoi函式變為整形
//例如123456789087654321->第乙個資料為087654321第二個資料為123456789
//倒著讀入並轉換成整形的
int convert(char *data,int *temp)
} if(lenth%9 == 0)
return k-1;
while(j<9)//如果最後乙個資料長度小於9,就填充0
temp[k]=atoi(temp_data);//最後乙個資料
return k;
}//計算函式,傳參,
//第乙個資料的整形陣列
//陣列使用長度
//第乙個資料的整形陣列
//陣列使用長度
//結果儲存整形陣列
int calc(int *data1,int dw1,int *data2,int dw2,int *result)
else//無需進製
k++;
} while(i<=dw1)//資料1長度比資料2長時接下來的資料處理
result[k]=data1[i]+1;
jw=0;
} else
result[k]=data1[i];
k++;
i++;
} while(j<=dw2)//資料2長度比資料1長時接下來的資料處理
result[k]=data2[j]+1;
jw=0;
} else
result[k]=data2[j];
k++;
j++;
} if(jw==1)
return k-1;//返回結果的整形陣列存入資料的個數
}int main()
;//存第乙個輸入的資料,最長資料99位喲
char data2[100]=;//存第二個輸入的資料,最長資料99位喲
int temp1[11]=;//存第乙個資料轉化為整形的資料
int temp2[11]=;//存第二個資料轉化為整形的資料
int result[11]=;//存結果的整形資料
int dw1=0,dw2=0,result_dw=0;//陣列下標,對應資料1,2和結果
int i=0;//控制結果列印的迴圈
printf("input data1:");
gets(data1);
dw1=convert(data1,temp1);//資料1轉化為整形陣列
printf("input data2:");
gets(data2);
dw2=convert(data2,temp2);//資料2轉化為整形陣列
result_dw=calc(temp1,dw1,temp2,dw2,result);//計算
printf("#####result:");
for(i=result_dw;i>=0;i--)
printf("\n");
return 0;
}
這段**寫了我乙個半小時,
半小時以為自己寫完了
執行,有bug,不等長資料計算錯誤,轉換有問題,顯示有問題......
半小時以後以為自己寫完了
執行,有bug,進製有問題,連續進製有問題......
半小時以後以為自己寫完了
嗯,應該是寫完了,沒測出啥錯誤了,哭
原諒乙個計算機萌新。。。不。。我都工作五個月了,寫這種**用了快兩個小時,我對自己是個程式設計師表示羞愧,想去屎。
寫到一半,寫calc計算函式時候,我腦子裡一閃,我為什麼不直接讓兩個資料乙個字元乙個字元的相加,直接data1[n]+data2[n]-'0'-'0'不就行了嘛,在搞個標誌看是否進製。。。。。。比我之前的想法簡單多了,別拉我,讓我去屎,不論從哪個方面看,演算法,複雜度(這玩意我也不是很了解哈哈),看著我寫的**都像個傻子qaq。
如果我想實踐我後來的想法再寫吧。完
C語言實現超大數相加
思路 不考慮輸入非法的情況 超大數無法使用char int float double進行資料儲存,所以使用陣列進行資料儲存,且資料為ascii碼的形式 include include include define max 256 define carry flag 9 1 將輸入的大數存放起來 vo...
JS如何實現兩個超大數相加
如果想要對兩個超大的整數進行加法運算,但又想輸出一般形式,使用 是無法達到的,因為一旦結果值超過number.max safe integer就會被轉換成科學計數法,並且數字精度相比之前將會有誤差,此時需要自己寫一套加法演算法,原理就是小學學習加減法時候的演算法,相應位數字相加,滿十進一。funct...
兩個超大整數相加 c
昨天面試有個題,時間太緊,來不及寫了,回家除錯一下 函式原型 bool add const char a,const char b,char dest 思路 模擬人工加法的過程,先從末尾開始加。如果存在進製,則標記 include using namespace std bool add const...