測試用例:
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...