c++对输入的两个超过计算机计算范围的2n位大整数x和y,用递归的方式实现乘积运算,设计并使时间复杂度为o(n1.59)
#include <iostream>
#include <string>
using namespace std;
string karatsuba(string x, string y) {
int n = x.length();
if (n == 1) {
return to_string(stoi(x) * stoi(y));
}
string a = x.substr(0, n/2);
string b = x.substr(n/2);
string c = y.substr(0, n/2);
string d = y.substr(n/2);
string ac = karatsuba(a, c);
string bd = karatsuba(b, d);
string abcd = karatsuba(to_string(stoi(a)+stoi(b)), to_string(stoi(c)+stoi(d)));
string adbc = to_string(stoi(abcd)-stoi(ac)-stoi(bd));
string zeros(2*n, '0');
string ans = zeros;
ans.replace(0, ac.length(), ac);
ans.replace(n, bd.length(), bd);
ans.replace(n/2, adbc.length(), adbc);
return ans;
}
int main() {
string x, y;
cin >> x >> y;
cout << karatsuba(x, y) << endl;
return 0;
}
但既然简单,也就简单的实现以下,只当是练习了一遍打字 ^_^
还是直接贴代码:
//冒泡排序
void BubbleSort(vector<int> &a)
{
int i,j;
for (i=0;i<a.size();i++) //每次循环确定一个最大值
{
for(j=0;j<a.size()-i-1;j++) //第i次循环,已经将i+1个元素排列好了
{
if (a[j]>a[j+1]) //与相邻元素比较
//体会 “冒泡”二字,就是最大的元素逐渐的 “沉” 下去
swap_ele(&a[j],&a[j+1]);
}
}
}
以上代码是将大数“沉”下去,若想将小数“浮”上来,只需从尾部开始遍历。