超大整數相加

2021-10-06 14:33:20 字數 3462 閱讀 7125

輸入

第乙個數字m代表接下來有幾組資料;

接下來每一組資料報含兩個資料,數字很大哦;

確保沒有字首0,資料很大;

輸出輸出計算後的結果,每個結果佔一行;

樣例輸入

3123 456

1234567890987654321 9876543210123456789

11111111111111111111111111111 111111111111111111111111111111

樣例輸出

57911111111101111111110

122222222222222222222222222222

*//* 解決這個問題需要處理的小問題:

1.如何儲存很長的數字(型別的變數存不了幾十位長的整數!)

2.如何將儲存的資料以合適的方法取出來,進行計算

// 下面用的方法是囉嗦的,但是明確了:往字元陣列裡填充某個整數,該整數會被視為某個字元的ascii碼值.

而往整形陣列裡填充整數,那促進去的就是整數本省(嗎?)

**了如何從整數存到字元陣列,如何從字元陣列提取出一位(叫數碼嗎?)整數(0~9範圍的)(相差48/『0』)

對與0有關的陣列的初始化往往會漏帶掉導致隨機值的莫名其妙

同一陣列使用strcpy是十分不建議的. */

#include

#include

// 返回字串?/指向字串的指標? char strlonger();

intmain()

else

strcpy

(&sum_up[1]

,big)

;/* 試圖空出sum_up[0]這個可能的最高位. (該操作確實可行) */

/* 當然,這樣sum_up[0]的值是隨機的,你以選擇初始化,當然這題不必須,因為輸出的為可能1.從[1]開始輸出;2.[0]會被進製值覆蓋(為1) */

/* 位置對齊(其實這件事並不必要

,當然,它對於連鎖進製還是提供了方便):

但還可以調整填入sum_up的順序來(高位往後填充,再逆序從高到低輸出.)這就無需對齊

事實上,逆(反)序填充,正序輸出的手段可以減少很多的不必要的工作量(輸出方式是很靈活的),

考試的話前者的定位更合適,平時我們正序排列還正序輸出只是為了試驗某些知識點,檢驗思維漏洞(這還未必能辦到,就不要死磕)*/

/* 版本一有巨大缺陷 */

// if(dif > 0)

//

// small[len_small] = '0'; //這句話有待商榷:

// }

/* 版本2 */

//// strcpy(small[len_big - len_small],small);這裡是為什麼?處理較長的的輸入是就會報錯segmentation fault

/* 在同乙個字串中使用strcpy有哪些風險? */

for(

int i =

0;i)for

(int i =

0;i)//可以考慮使用字串函式.

/* 打個補丁 */

small[len_big]

='\0'

;/* 對齊後重新整理len_small */

len_small =

strlen

(small)

;/* 將字元轉化為數字 */

/* int big_last;

big_last = (int)big[len_big-1] - 48; */

//test將會是存入的數字字元的ascii值,然而,

//由於ascii值具有良好的遞增規律,-48就可以轉換為輸入的數字大小了

//printf("%d",test);

/* 小學的按位加法(及進製) */

for(

int i =

0;i)/* i 類似(前移)改變量 */

/* 若不發生進製 */

else

sum_up[len_big - i ]

= signal_add_i +

'0';}//

if(up ==1)

/* 我竟然寫成了賦值號 = */

//if(up = 1) sum_up[len_big - len_small - 1] += 1;

/* 列印的時候分個類(首位是否被進製) */

else

printf

("%s\n"

,&sum_up[1]

);/* 非首位址,需& */

//printf("\n out2: %s\n",&sum_up[1]);}}

return0;

}

版本_2:(簡)

#include

#include

intmain()

,/*每一位都初始化為0.*/

num2[

10000]=

, len1, len2, i, j;

scanf

("%s%s"

, s1, s2)

;/*%s來讀取輸入*/

len1 =

strlen

(s1)

; len2 =

strlen

(s2)

;/* 兩個控制變數,使得字元轉數字的填充過程中,低位填在前,高位向後填,方便數字對齊相加*/

i = len1 -1;

/*從最低為起往高位(向前)*/

j =0;

/*從最高位往低位(向後)*/

for(

; i >=0;

)/*處理第二個運算元*/

for(i = len2 -

1, j =

0; i >=

0; i--

)/* (len2 > len1 ? len2 : len1)的運算結果是len2和len1的較大值,十分緊湊 */

for(i =

0; i <

(len2 > len1 ? len2 : len1)

; i++)}

//for(本迴圈無法判斷最高位;兩個數相加,若數量級增大,則最高位必為1)

/* 最高位的情況(是否進製,以及填充到適當的位置 還需單獨判斷下: */

/* 上頭的i++在跳出for是已經移位都最高位(如果進製的話) */

/* 最低位放在num1陣列的最前面,這樣方便處理未知的最高位,屆時逆序輸出即可

(從後往前列印(高位-->低位)) */

/*如果進製*/

if(num1[i]

)/* 最高位是否1(此時的num1[i]只為1/0 (1是低位進上去的;0則是之前memset()初始化的值,且沒有進製)) */

/*不進製: */

else}}

return0;

}

兩個超大整數相加 c

昨天面試有個題,時間太緊,來不及寫了,回家除錯一下 函式原型 bool add const char a,const char b,char dest 思路 模擬人工加法的過程,先從末尾開始加。如果存在進製,則標記 include using namespace std bool add const...

大整數相加

include include include include 思路如下 將兩個字串分別由低位到高位放置到int陣列中 然後每位對齊相加,大於10,本位取餘,高位進1 char bigintadd const char numstr1,const char numstr2 for i len1 i ...

特大整數相加

一 特大整數描述 int和long作為基本的整數型別,取值範圍和位數直接相關。如果是n位整數的話,最高位表示符號位,剩下的n 1位以補碼形式表示絕對值,因此範圍是整數區間 2 n 1 2 n 1 int和long並沒有明確位數,一般而言,32位機的int是32位的,於是範圍是 2 31,2 31 也...