实现大数的乘法和加法,请问一下还要怎么提高运行效率
LargeNumber LargeNumber::operator+(const LargeNumber& large_num1)
{
int maxlen = max(len,large_num1.len);
int len1 = large_num1.len - 1; //a,b分别表示两个字符数组的长度
int len2 = len - 1;
LargeNumber result(maxlen + 1);
int char1 = 0; //用来存储第一个字符数组的字符
int char2 = 0; //用来存储第二个字符数组的字符
int c = 0; //用来存储进位
for (int i = maxlen; i>0; i--)
{
char1 = char2 = 0;
if (len1 >= 0)
{
char1 = large_num1.largeNum[len1] - '0'; //初始化
len1--;
}
if (len2 >= 0)
{
char2 = largeNum[len2] - '0';
len2--;
}
result[i] = (char1 + char2 + c) % 10 + '0';
c = (char1 + char2 + c) / 10;
}
result[0] = '0' + c;
result.del_0();
return result;
}
LargeNumber LargeNumber::operator*(const LargeNumber& largeNum_1)
{
start = clock();
int maxlen = max(largeNum_1.len,len);
LargeNumber* product = new LargeNumber[maxlen];
int char1 = 0; //用来存储第一个字符数组的字符
int char2 = 0; //用来存储第二个字符数组的字符
product[0] = largeNum_1.len > len ? largeNum_1 : *this;
product[0].doubleLen();
for (int i = 1; i < maxlen; i++)
{
product[i] = product[i - 1];
}
finish = clock();
cout << finish - start << endl;
int carry; //进位
int temp = 0;
for (int i = largeNum_1.len - 1; i >= 0; i--)
{
carry = 0;
char1 = largeNum_1.largeNum[i];
if (i < largeNum_1.len - 1)
{
temp++; //错位
}
//cout<<temp<<endl;
for (int j = len - 1; j >= -1; j--)
{
if (char1 == 0 || char2 == 0)
{
product[temp][maxlen * 2 - (len - j) - temp] = '0';
}
char2 = largeNum[j];
product[temp][maxlen * 2 - (len - j) - temp] = (carry + char1 * char2) % 10 + '0';
carry = (carry + char1 * char2) / 10;
//cout<<carry<<endl;
}
}
LargeNumber result = product[0];
for (int i = 1; i < len; i++)
{
result = result + product[i];
}
return result;
}
------解决思路----------------------
用字符串来表示整数本身效率就不会高了
要效率高应该让每次加法都用到机器的上限,每次加法都是使用 32 位来加,而不是 8 位 8 位的加,数可以表示成整数的数组,而不是字符的数组
------解决思路----------------------
正解,好像有一些第三方的表示大数的类库,如果要表示一个128位整数,可以把他分成两个64位整数分别表示高字节段和低字节段