c語言實現兩個超大數的相加(超長資料)

2021-09-02 02:44:13 字數 2582 閱讀 8576

這幾天無聊,突然想起來,大學當時有個問題困擾著我

兩個超大的數怎麼儲存和相加呢,計算機的整形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...