演算法 大整數乘法

2021-09-01 20:30:12 字數 2443 閱讀 6732

問題描述

求兩個不超過200位的非負整數的積。

輸入形式

有兩行,每行是乙個不超過200位的非負整數,沒有多餘的前導0。

輸出形式

一行,即相乘後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。

樣例輸入

1234567890

9876543210

樣例輸出

12193263111263526900

1     :採用了陣列的形式進行計算。將輸入的值以字元的形式存到陣列中取,再轉化成整數形式相乘。

2.    根據課本的描述採用分治的方法求解。主要部分是遞迴的不同種情況。當n=2時直接求解,當n>2,則對其進行分治。按照公式:a*b=a1*b1*10^n+[(a1+a0)*(b0+b1)-a1*a0-b1*b0]*10^n/2+a0*b0求解

#include#includeusing namespace std;

int main();

cin>>a;

cin>>b;

int lena = strlen(a);

int lenb = strlen(b);

int i,j;

for(i=lena-1,j=0;i>=0;i--)

for(i=lenb-1,j=0;i>=0;i--)

for(i=0;i=10)

}for(i=400;i>0;i--)

for(;i>=0;i--)

cout《第二種:

#include#include#include#includeusing namespace std;

//string轉換為int

int str_to_int(string s)

//int轉換為string

string int_to_str(int num)

//前置0 ,因為大數的長度必須要為2^n的倍數,才能劃分

//去掉前置零,substr()複製子字串

void removeprezero(string &s)

//大數相加

string add(string s1, string s2)

return s;

} //大數相減

string sub(string &s1, string &s2)

else if (s1.at(i) < s2.at(i))

} if (i == len1)s == "0";

} int* num = (int*)malloc(sizeof(int)*len);

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

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

int c = 0; //記錄結果位數

for (int i = 0; i < len; i++)

for (int j = 0; j < c; j++)

} c--;

//去除可能存在的前置零

while (num[c] == 0)c--;

for (int j = 0; j <=c; j++)

if (flag == "-")return flag + s;

else return s;

}//增加前置0

void addprezero(string &s, int l)

//增加後置0,大數*10^n 相當於在數的後面加n個0

string addlastzero(string s, int l)

//大數相乘

string mult(string &s1, string &s2)

if (s2.at(0) == '-')

if (flag1 || flag2) sign = "-";

else sign = "+";

int l = 4;

//前置若干個0,使長度為2^n的倍數

if (s1.length() > 2 || s2.length() > 2)

else

} if (s1.length() == 1)addprezero(s1, 1);

if (s2.length() == 1)addprezero(s2, 1);

//進行運算

int n = s1.length();

string result, a0, a1, b0, b1;

if (n > 1)

if (n == 2) else

if (sign == "-")result.insert(0, sign);

return result;

}int main()

分治演算法 大整數乘法

用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。分析 用分治演算法程式設計實現兩個n 位十進位製大整數的乘法運算。演算法描述 兩個十進位制的數 x y x a 10 n1 b y c 10 n2 d 則 x y a 10 n1 b c 10 n2 d 設乙個陣列,將其看做10000 進製...

演算法 大整數求和 乘法

大整數乘法 以 426709752318 95481253129 為例,來看看大整數相加的詳細步驟 建立2個陣列,把整數倒序儲存 整數的個位存於陣列0下標位置,最高位存於陣列長度 1下標位置。之所以倒序儲存,更加符合我們從左到右訪問陣列的習慣。建立結果陣列,結果陣列的最大長度是較大整數的位數 1 遍...

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...