C 學習之路(44) C 大數問題

2021-08-18 13:09:46 字數 3152 閱讀 1099

1. 大數相加

1、從結尾開始每位相加 

2、兩個整數長度不相等(肯定有乙個已經加完了,再把沒有加完的加上去) 

3、最高位有進製,要再進一位 

4、結果字串逆序

2. 大數相乘

- 分析

12*34=? 

乘數:12 

被乘數:34 

1、先把乘數列出來,第i行列左起第i位數,列n次(n為乘數的位數) 

第二行起每次右移一位

(1)

(1)(2)

(2)

2、寫入被乘數,按先列後行的方式

(1,3)

(1,4)

(2,3)

(2,4)

3、將()內的數兩乘

(1,3=3)

(1,4=4)

(2,3=6)

(2,4=8)

4、相加,注意進製

(1,3=3) (1,4=4)

(2,3=6) (2,4=8)

-------------------------

3 10 8

.

-------------------------

4 0 8

12*34=408

再看三位數乘法

123*456=? 

第一步:

(1)

(1)(1)

(2)(2)

(2)(3)

(3)(3)

第二步:

(1,4)

(1,5)

(1,6)

(2,4)

(2,5)

(2,6)

(3,4)

(3,5)

(3,6)

第三步:

(1,4=4)

(1,5=5)

(1,6=6)

(2,4=8)

(2,5=10)

(2,6=12)

(3,4=12)

(3,5=15)

(3,6=18)

第四步:

(1,4= 4) (1,5= 5) (1,6= 6)

(2,4= 8) (2,5=10) (2,6=12)

(3,4=12) (3,5=15) (3,6=18)

----------------------------------------------

4 13 28 27 18

. . . .

----------------------------------------------

5 6 0 8 8

123*456=56088 

分析一下每一位的值是如何計算出來的,以下說的位都是從個位算起:

結果的第i位,是乘數的第i位乘以被乘數的1位,再加上乘數的第i-1位乘以被乘數的第2位,一起加到乘數的第1位乘以被乘數的第i位。 

這樣描述起來有點不明白,畫個圖就很清楚了: 

123*456的第3位:從乘數的第3位(1)起到第1位(3),按從右向左的方式 

逐個乘以被乘數: 

1*6+2*5+3*4=28 

再把進製加上就可以了。 

即:計算結果的第i位(權值肯定為i,第1位也就是個位權值為0(pow(10, 0)))。等於乘數的第(i~0)位分別與被乘數的第(0~i)位相乘,因為這樣每位相乘之後權值仍為i 。然後相加再加上前一位的進製,就是結果的第i位

到這裡,已經可以得出乙個通用的計算方法,把結果逐位計算出來。 

通過上面的分析,我們知道了演算法的核心思想,接下來就能把演算法實現 

程式**:

#include 

#include

#include

#include

#include

using

namespace

std;

//c++大數相加

string bignumadd(const

string& strnum1, const

string& strnum2)

//兩個整數長度不相等(肯定有乙個已經加完了,不需要再額外加if來判斷,因為while就可以判斷)

while (len1 >= 0)

while (len2 >= 0)

//最高位有進製

if (bit != 0)

strsum += bit + '0';

//反轉

reverse(strsum.begin(), strsum.end());

return strsum;

}//c++大數相乘

string bignummultiply(const

string& strnum1, const

string& strnum2)

//加上進製

tmp += bit;

//為了防止最後一位是0,但是卻加上了

if (tmp == 0 && i == len1+len2+1)

break;

//求餘得到結果的第i位

strmultiply += tmp % 10 + '0';

//計算新的進製

bit = tmp / 10;

}//判斷結果的最後乙個字元如果是0的話說明可以刪去

//if (strmultiply[strmultiply.size()-1] == '0')

// strmultiply[strmultiply.size()-1] = '\0';

//反轉

reverse(strmultiply.begin(), strmultiply.end());

return strmultiply;

}int main()

cout

<< rlt << endl;

return

0;}

C 系列 44 C 記憶體洩露

首先我們需要明確,記憶體洩露是記憶體丟了嗎?答案當然是否定的,不可能買了8g的記憶體執行程式之後變成了2g。記憶體是不會像物理意義上的丟失的,丟的只是指向這一片區域的指標。記憶體洩漏指因為疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並不是指內存在物理上的消失,而是應用程式分配某段...

44 C 基礎 容器介紹

容器分為 順序容器,關聯容器,容器適配類 是一種各個元素之間有順序關係的線性表 verctor 將元素保持在連續的儲存空間 deque list 雙鏈表,從任何地方快速插入與刪除 2.1 vector 相當於陣列,可以通過下標隨機訪問,速度很快。但是在容器的中間位置新增和刪除檔案非常耗時。因為一次插...

牛客挑戰賽44 C 有用的 LCM

on考慮將lcm lcmlc m分解質因數lcm pi cilcm prod p i lcm p ici 容易發現答案即為 ci sum c i ci 顯然想到對n nn進行根號分塊 不大於n sqrt n n 的質因數對答案做log loglo g次貢獻 大於n sqrt n n 的質因數只對答案...