陣列形式的整數加法 C語言

2022-10-08 18:48:13 字數 3077 閱讀 2115

不多bb, 直接開整,今天我們來學一下大數的加減法,看完對您應該有所收穫。

大數顧名思義就是乙個很龐大的數字,在各種語言中,系統自帶的變數型別是無法存放這樣的數字,所以我們需要自己想辦法,將這樣的數存起來,leetcode中有一道題就是如此,將起存放在乙個陣列當中。我們就先從乙個題目開始講起......

整數的 陣列形式  num 是按照從左到右的順序表示其數字的陣列。

例如,對於 num = 1321 ,陣列形式是 [1,3,2,1] 。

給定 num ,整數的 陣列形式 ,和整數 k ,返回 整數 num + k 的 陣列形式 。

int* addtoarrayform(int* num, int numsize, int k, int* returnsize)
看得出示例中陣列的大小跟k之前是沒有確定誰大誰小;

加法會產生進製;

結果應該不能儲存在num中,我們需要自己開闢乙個空間來足以存放下計算結果;

加法的規則:

1. 逢十進一;

2. 對應位數相加,各位加各位,十位加十位,.......;

函式返回值就是乙個計算好的陣列,同時再返回計算好陣列的長度returnsize;

這裡傳的是乙個數值k,在某種程度上也算是陣列的形式,因為你可以一位一位的把k的個位,十位...分離出來然後放到乙個陣列裡

int* addtoarrayform(int* num, int numsize, int k, int* returnsize)

int maxlength = k_count > numsize ? k_count : numsize;

int* returnarray = (int*)malloc(sizeof(int) * (maxlength + 1));//我們已經開闢好空間來存放加法後的數字了,這裡加一是為了保證儲存進製值

if(returnarray == null)//開闢失敗,返回null指標

return null;

int add_length = maxlength;

int next = 0;//進製訊號

int rcuri = maxlength;//指向returnarray陣列最後乙個元素

int acuri = numsize - 1;//指向num陣列最後乙個元素

while (add_length--)//顯然這裡maxlength放這裡只能處理maxlength資料,而開闢的空間有maxlength + 1,即returnarray指向的第乙個資料我們並沒有操作

else

rcuri--;

k /= 10;

acuri--;

} //迴圈結束之後我們還需要把第乙個元素操作一下,但其實returnarray指向第乙個元素要麼是0要麼是1,所以直接賦值next給第乙個元素即可

returnarray[rcuri] = next;

if(next)//next如果有進製,則表示returnarray指向的第乙個元素是1,則按我們閱讀習慣需要看到1;

else//如果沒有進製,則表示returnarray指向的第乙個元素是0,則按我們閱讀習慣不需要看到0;

}

大數加法考察我們對於加法這種常見運算的規則掌握如何,我們應該要透過現象看本質,把他們變成乙個個你熟悉的邏輯,就可以逐一攻破;

我們也要掌握通過特殊現象來推理出一般的情況,只有把問題考慮周全才有可能把它做好;

理想很美好,現實很殘酷,只有不斷的學習,鍛鍊自己的思維,才能活著更輕鬆;

掌握一定的矛盾分析法,也是一種終身受益的技能;

我們不玩虛的,直接開幹!

我們不知道兩個陣列誰大誰小,重新開闢乙個num空間來存放減法計算出來的值;

減出來的數有負數;

可能會遇到不夠減的情況,要考慮借位;

減法的規則:

1.不夠減的位,向高位借一加十,再相減;

2.對應位相減,個位減個位,十位減十位,......;

int* subtoarrayform(int* num1, int num1size, int* num2, int num2size, int* returnsize, int* signbit)

int state = 1;//假設一開始就是兩個數相等,就可以直接利用這個不出現負數的情況,直接走(num1 - num2)

if (num1size < num2size)

state = 0;//負數

else if (num1size > num2size)

state = 1;//正數

else //長度相等,判斷一下誰大

else if ((num1[i] - num2[i]) < 0)

}} int borrow = 0;//借位訊號

int rcuri = maxlength - 1;//指向returnarray最後乙個元素

int ncuri1 = num1size - 1;//指向num1最後乙個元素

int ncuri2 = num2size - 1;//指向num2最後乙個元素

int sub_length = maxlength;//控制迴圈

if (state == 0)

else

rcuri--;

ncuri1--;

ncuri2--;

} }else if (state == 1)

else

rcuri--;

ncuri1--;

ncuri2--;

} }*(returnsize) = maxlength;//直接返回maxlength即可,因為減出來最大的位數,就是按減數和被減數最大的那乙個

return returnarray;//在外面free一下

}

跟加法一樣,需要用到減法的運算規則,把規則變成**實現也是一種鍛鍊方式;

掌握個例,也是完成**的一部分;

更新

2022.3.10

15:32

C 陣列形式的整數加法

對於非負整數 x 而言,x 的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 x 1231,那麼其陣列形式為 給定非負整數 x 的陣列形式 a,返回整數 x k 的陣列形式 示例 輸入 a k 806 輸入 a k 1 輸出 輸出 1,0 0,0 0,0 0,0 0,0 0 解釋 215 ...

C語言解法 陣列形式的整數加法

對於非負整數 x 而言,x 的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 x 1231,那麼其陣列形式為 1,2,3,1 給定非負整數 x 的陣列形式 a,返回整數 x k 的陣列形式。示例 1 輸入 a 1,2,0,0 k 34 輸出 1,2,3,4 解釋 1200 34 1234 ...

陣列形式的整數加法

對於非負整數 x 而言,x 的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 x 1231,那麼其陣列形式為 1,2,3,1 給定非負整數 x 的陣列形式 a,返回整數 x k 的陣列形式。示例 1 輸入 a 1,2,0,0 k 34 輸出 1,2,3,4 解釋 1200 34 1234 ...