C++中的大数乘法 我在C++中寻找一个快速的乘法算法。 我尝试过类似的方法,但我认为我创建的字符串对象太多了 string sum(string v1, string v2) { string r; int temp = 0, i, n, m; int size1 = v1.size(), size2 = v2.size(); n = min(size1, size2); m = max(size1, size2); if ((v1 == "0" || v1 == "") && (v2 == "0" || v2 == "")) return "0"; r.resize(m, '0'); for (i = 0; i < n; i++) { temp += v1[size1 - 1 - i] + v2[size2 - 1 - i] - 96; r[m - 1 - i] = temp % 10 + 48; temp /= 10; } while (i < size1) { temp += v1[size1 - 1 - i] - 48; r[m - 1 - i] = (char)(temp % 10 + 48); temp /= 10; ++i; } while (i < size2) { temp += v2[size2 - 1 - i] - 48; r[m - 1 - i] = (char)(temp % 10 + 48); temp /= 10; ++i; } if (temp != 0) r = (char)(temp + 48) + r; return r; } string multSmall(string v1, int m) { string ret = "0"; while(m) { if (m & 1) ret = sum(ret, v1); m >>= 1; if (m) v1 = sum(v1, v1); } return ret; } string multAll(string v1, string v2) { string ret = "0", z = "", pom; int i, size; if (v1.size() < v2.size()) std::swap(v1, v2); size = v2.size(); for (i = 0; i < size; i++) { pom = multSmall(v1, v2[size - 1 - i] - 48); pom.append(z); ret = sum(ret, pom); z.resize(i + 1, '0'); } return ret; }

C++中的大数乘法 我在C++中寻找一个快速的乘法算法。 我尝试过类似的方法,但我认为我创建的字符串对象太多了 string sum(string v1, string v2) { string r; int temp = 0, i, n, m; int size1 = v1.size(), size2 = v2.size(); n = min(size1, size2); m = max(size1, size2); if ((v1 == "0" || v1 == "") && (v2 == "0" || v2 == "")) return "0"; r.resize(m, '0'); for (i = 0; i < n; i++) { temp += v1[size1 - 1 - i] + v2[size2 - 1 - i] - 96; r[m - 1 - i] = temp % 10 + 48; temp /= 10; } while (i < size1) { temp += v1[size1 - 1 - i] - 48; r[m - 1 - i] = (char)(temp % 10 + 48); temp /= 10; ++i; } while (i < size2) { temp += v2[size2 - 1 - i] - 48; r[m - 1 - i] = (char)(temp % 10 + 48); temp /= 10; ++i; } if (temp != 0) r = (char)(temp + 48) + r; return r; } string multSmall(string v1, int m) { string ret = "0"; while(m) { if (m & 1) ret = sum(ret, v1); m >>= 1; if (m) v1 = sum(v1, v1); } return ret; } string multAll(string v1, string v2) { string ret = "0", z = "", pom; int i, size; if (v1.size() < v2.size()) std::swap(v1, v2); size = v2.size(); for (i = 0; i < size; i++) { pom = multSmall(v1, v2[size - 1 - i] - 48); pom.append(z); ret = sum(ret, pom); z.resize(i + 1, '0'); } return ret; },c++,arrays,string,multiplication,C++,Arrays,String,Multiplication,我不想使用任何外部库。我该怎么做?也许我应该使用字符数组而不是字符串?但我不确定为数组重新分配内存是否比创建字符串对象快。快速大数乘法是一个大项目。这是一个非常大的项目,取决于你想要乘以多少个数字 然而,可能最简单最重要的事情是,您希望尽可能多地利用CPU的本机指令。64位数字的加法功能是8位数字加法功能的8倍,是十进制数字加法功能的19倍以上。但您的计算机可能可以像添加8位数字一样快速地添加64位数字,并且比您编写的任何十进制数字相加代码都要快得多 乘法更具戏剧性;将两个64位数字相乘以生成1

我不想使用任何外部库。我该怎么做?也许我应该使用字符数组而不是字符串?但我不确定为数组重新分配内存是否比创建字符串对象快。

快速大数乘法是一个大项目。这是一个非常大的项目,取决于你想要乘以多少个数字

然而,可能最简单最重要的事情是,您希望尽可能多地利用CPU的本机指令。64位数字的加法功能是8位数字加法功能的8倍,是十进制数字加法功能的19倍以上。但您的计算机可能可以像添加8位数字一样快速地添加64位数字,并且比您编写的任何十进制数字相加代码都要快得多

乘法更具戏剧性;将两个64位数字相乘以生成128位结果的指令所做的工作是将两个8位数字相乘以生成16位结果的指令所做工作的64倍左右,但您的CPU可能以相同的速度执行这些操作,或者后者的速度是前者的两倍

因此,您确实希望围绕尽可能多地使用这些更强大的指令的想法来确定数据结构和基本案例算法的方向


如果需要,可以将其视为以2^64为基数进行算术运算。如果您不能或不想使用64位算术,也可以使用基数2^32,请看一看:快速大数乘法的愿望和将大数存储为ascii编码的十进制字符串的实现可能存在重复,这两种情况基本上是不一致的。如果您真的想要fast,那么您需要将数字实现为一个全字大小的整数数组,无论是32位还是64位。如果你想存储为ascii字符串,那么你需要在快速位上妥协。。。