高精度算法通常用于处理超过标准整数类型的大数的最大公因数计算。以下是一个使用辗转相除法(欧几里得算法)实现的C++程序,它将字符串作为输入,以支持高精度运算:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
// 比较两个字符串大小
bool compareStrings(const string& a, const string& b) {
return a < b;
}
// 字符串翻转函数
void reverseString(string& str) {
int n = str.length();
for (int i = 0; i < n / 2; i++) {
swap(str[i], str[n - i - 1]);
}
}
// 字符串除法操作,计算商和余数
pair<string, string> divideString(const string& dividend, const string& divisor) {
if (compareStrings(dividend, divisor)) {
return make_pair("0", dividend);
}
string quotient = "";
string remainder = dividend;
int lenDividend = dividend.length(), lenDivisor = divisor.length();
for (int i = 0; i <= lenDividend - lenDivisor; ++i) {
if (compareStrings(remainder.substr(0, lenDivisor), divisor)) {
remainder = remainder.substr(1);
quotient += "0";
} else {
string temp = remainder.substr(0, lenDivisor + 1);
int multiple = 1;
while (compareStrings(temp, divisor)) {
temp.insert(temp.begin(), '0');
multiple *= 10;
}
remainder = remainder.substr(lenDivisor + 1);
quotient += to_string(multiple / divisor.length());
}
}
reverseString(quotient);
return make_pair(quotient, remainder);
}
// 计算最大公因数
string gcd(const string& num1, const string& num2) {
string a = num1, b = num2;
while (!b.empty()) {
a.swap(b);
tie(ignore, b) = divideString(b, a);
}
return a;
}
int main() {
string num1, num2;
cout << "请输入第一个大整数:";
cin >> num1;
cout << "请输入第二个大整数:";
cin >> num2;
string result = gcd(num1, num2);
cout << "最大公因数是:" << result << endl;
return 0;
}
这段代码定义了处理大整数所需的基本操作,包括比较、翻转字符串、除法以及计算最大公因数。在主函数中,我们读取两个大整数作为字符串输入,然后调用 gcd
函数计算它们的最大公因数,并将结果输出。
请注意,这个程序假设输入的都是正整数,且不包含任何前导零。如果需要处理负数或可能的前导零,你可能需要添加额外的逻辑来处理这些情况。