私はkaratsubaの乗算アルゴリズムを実装しました。私はこの方法で2桁の64桁の数字を掛けることができるように改善したいと思いますが、どうやってこれを行うのか分かりません。私は両方の数字に2のべき乗である数字の桁数が含まれていることを示唆しましたが、それは何も示唆していません。他のヒントを教えてください。数学ヒントやアルゴリズム改善のヒント。ここでC++で2つの64桁の数字を掛ける
#include <iostream>
#include <math.h>
using namespace std;
int getLength(long long value);
long long multiply(long long x, long long y);
int getLength(long long value)
{
int counter = 0;
while (value != 0)
{
counter++;
value /= 10;
}
return counter;
}
long long multiply(long long x, long long y)
{
int xLength = getLength(x);
int yLength = getLength(y);
// the bigger of the two lengths
int N = (int)(fmax(xLength, yLength));
// if the max length is small it's faster to just flat out multiply the two nums
if (N < 10)
return x * y;
//max length divided and rounded up
N = (N/2) + (N % 2);
long long multiplier = pow(10, N);
long long b = x/multiplier;
long long a = x - (b * multiplier);
long long d = y/multiplier;
long long c = y - (d * N);
long long z0 = multiply(a, c);
long long z1 = multiply(a + b, c + d);
long long z2 = multiply(b, d);
return z0 + ((z1 - z0 - z2) * multiplier) + (z2 * (long long)(pow(10, 2 * N)));
}
int main()
{
long long a;
long long b;
cin >> a;
cout << '\n';
cin >> b;
cout << '\n' << multiply(a, b) << endl;
return 0;
}
は別ですヒント: 'pow()'を使う[あなたに間違った答えを与える](http://stackoverflow.com/questions/18155883/strange-behavio浮動小数点演算が壊れているため)(http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –
'long long'は2つの64桁の数字の間に乗算の結果を格納することはできません。実際には、64桁の数字を1つでも保持することはできません。整数オーバーフローが発生し、未定義の動作につながります。独自のBigNumberクラスが必要になります。 – AndyG
私は知っているが、私はアルゴリズムを改善することができないので、私は助けを求めている。たぶんアイデア。たぶん私はヒントを得たとして数学のトリックがあります:64 = 2^6 –