大數相乘以及其高效演算法

2021-06-01 11:46:40 字數 1831 閱讀 6324

測試用例:

999 999

999999999999      999999999999

下面分析下999*999

6    5   4

6   5    4

36 30 24

30 25 20

24 20 16

這裡結果 就清楚了

但是要注意    asc 碼  最大是 128    所以要在加的時候就處理好   

下面給出**     普通  最一般的**  

/*

name: hondely

author: hondely

date: 05/11/11 14:34

description:

*/#include using namespace std;

void mul(char *ch1, char *ch2)

} }for (i=len1+len2-1; i>0; --i)//防止上面進製時大於9的情況 }

if (ch3[0]>9)//if (ch[3]>99)

return 0;

}

下面是傅利葉高效演算法,自己不懂順便貼上過來了   對傅利葉變換一竅不通

#include #include #include #include using namespace std;  

const double pi = acos(-1);

typedef complexcp;

typedef long long int64;

const int n = 1 << 16;

int64 a[n], b[n], c[n << 1];

void bit_reverse_copy(cp a, int n, cp b)

} void fft(cp _x, int n, bool flag)

} }

memcpy(_x, x, sizeof(cp) * n);

}

void polynomial_multiply(int64 a, int na, int64 b, int nb, int64 c, int &nc)

for (nc = na + nb - 1; nc > 1 && !c[nc - 1]; --nc);

}

const int len = 5, mod = 100000;

void convert(char *s, int64 a, int &n)

i += len;

if (i)

}

void print(int64 a, int n)

char buf[n + 10];

int main()

else convert(buf, a, na);

scanf("%s", buf);

if (buf[0] == '-')

else convert(buf, b, nb);

polynomial_multiply(a, na, b, nb, c, nc);

int64 t1, t2;

t1 = 0;

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

for (; t1; t1 /= mod) c[nc++] = t1 % mod;

if (sign) putchar('-');

print(c, nc);

} return 0;

}

字串實現大數相乘以及大數相加

1.大數相加 第一種思路,在短的字串中補零 class solution while al bl for int j a.size 1 j 0 j 從後到前遍歷所有的位數,同位相加 a 0 a 0 0 b 0 將ab的第0位相加 if a 0 2 若大於等於2,需要進一 return a 第二種傳統...

大數乘法問題及其高效演算法

求 1234567891011121314151617181920 2019181716151413121110987654321 的乘積結果分治乘法 最簡單的是karatsuba乘法,一般化以後有toom cook乘法 快速傅利葉變換fft 為了避免精度問題,可以改用快速數論變換fntt 時間複雜...

大數相乘演算法

啥也說,直接給 高精度的乘法,乘數的位數沒有限制,小數點後面的位數也沒有限制 輸入引數 乘數 str1,str2 輸出引數 str str1 str2 返回值型別 string string large mult string str1,string str2,string str 輸出引數 ass...