C++實(shí)現(xiàn)大數(shù)相乘算法
本文實(shí)例為大家分享了C++實(shí)現(xiàn)大數(shù)相乘的具體代碼,供大家參考,具體內(nèi)容如下
首先說一下乘法計(jì)算的算法:同樣是模擬人工計(jì)算時(shí)的方法。
從低位向高位乘,在豎式計(jì)算中,我們是將乘數(shù)第一位與被乘數(shù)的每一位相乘,記錄結(jié)果之后,用第二位相乘,記錄結(jié)果并且左移一位,以此類推,直到計(jì)算完最后一位,再將各項(xiàng)結(jié)果相加,得出最后結(jié)果。
計(jì)算的過程基本上和小學(xué)生列豎式做乘法相同。為編程方便,并不急于處理進(jìn)位,而將進(jìn)位問題留待最后統(tǒng)一處理。
我們以125*53為例來說明計(jì)算過程:
1、先算125*3,3*5得到15個(gè)1,3*2得到6個(gè)10,3*1得到3個(gè)100,下面是存儲(chǔ)結(jié)果的數(shù)組的形式
2、接下來算125*5,5*5得到25個(gè)10,2*5得到10個(gè)100,5*1得到5個(gè)1000;
3、乘法過程完畢。接下來從 a[0]開始向高位逐位處理進(jìn)位問題。a[0]留下5,把1 加到a[1]上,a[1]變?yōu)?2 后,應(yīng)留下2,把3 加到a[2]上……最終使得a里的每個(gè)元素都是1 位數(shù),結(jié)果就算出來了
結(jié)果就是6625。
總結(jié)一個(gè)規(guī)律:即一個(gè)數(shù)的第i 位和另一個(gè)數(shù)的第j 位相乘所得的數(shù),一定是要累加到結(jié)果的第i+j 位上。這里i, j 都是從右往左,從0 開始數(shù)。
即:ans[i+j] = a[i]*b[j];
另外進(jìn)位時(shí)要處理,當(dāng)前的值加上進(jìn)位的值再看本位數(shù)字是否又有進(jìn)位;前導(dǎo)清零。
下面是C++代碼實(shí)現(xiàn):
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
#define MAX 1010
int main()
{
string std1, std2;
cin>>std1>>std2;
int length1 = std1.length();
int length2 = std2.length();
int a[MAX] = {0};
int b[MAX] = {0};
int result[2 * MAX] = {0};
int i = 0, j = 0;
//將字符串轉(zhuǎn)移到數(shù)組中,以方便計(jì)算 ,注意是倒敘存儲(chǔ)
//即字符串123存為321,為的是將低位放在前面方便計(jì)算
for(i = length1 - 1, j = 0; i >= 0; i--, j++)
{
a[j] = std1[i] - '0';
}
for(i = length2 - 1, j = 0; i >= 0; i--, j++)
{
b[j] = std2[i] - '0';
}
//將結(jié)果儲(chǔ)存在 resullt中,result[i + j] = a[i] * b[j]是關(guān)鍵算法
for(i = 0; i < length1; i++)
{
for(j = 0; j < length2; j++)
{
result[i + j] += a[i] * b[j];
}
}
//從低位到高位進(jìn)行進(jìn)位
for(i = 0; i < (length1+length2); i++)
{
if(result[i] > 9)
{
result[i+1] += result[i]/10;
result[i] %= 10;
}
}
//將前導(dǎo)0全部剔掉,比如我們結(jié)果是236,在result中
//是這樣存儲(chǔ)的63200……我們需要定位到第一個(gè)不為零的數(shù),它的位置也就是i ,兩數(shù)相乘,位數(shù)最多是兩數(shù)位數(shù)之和
for(i = length1 + lengrh2; i >= 0 ; i--)
{
if(result[i] == 0) continue;
else break;
}
//接著i繼續(xù)輸出,就是我們的結(jié)果
for(; i >=0; i--)
cout<<result[i];
return 0;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:利用C++ R3層斷鏈實(shí)現(xiàn)模塊隱藏功能
欄 目:C語言
下一篇:C++使用string的大數(shù)取模運(yùn)算(5)
本文標(biāo)題:C++實(shí)現(xiàn)大數(shù)相乘算法
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/191.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10求斐波那契(Fibonacci)數(shù)列通項(xiàng)的七種實(shí)現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-11ajax實(shí)現(xiàn)頁面的局部加載


