下面是一个不使用库函数的C++程序,它通过高精度方法计算两个数的最大公因数(GCD)。这个程序使用数组来存储和操作大整数,并且使用了标准欧几里得算法。
#include <iostream>
using namespace std;
const int MAX_SIZE = 1000; // 定义最大位数
// 函数声明
void arrayGCD(int A[], int sizeA, int B[], int sizeB, int result[], int &resultSize);
void addArray(int A[], int sizeA, int B[], int sizeB, int result[], int &resultSize);
void printArray(int arr[], int size);
int main() {
int num1, num2;
cout << "请输入两个正整数:";
cin >> num1 >> num2;
int A[MAX_SIZE], B[MAX_SIZE], GCD[MAX_SIZE];
int sizeA = 0, sizeB = 0, resultSize;
// 将输入的数字转换为数组
for (int i = num1; i != 0; i /= 10) A[sizeA++] = i % 10;
for (int i = num2; i != 0; i /= 10) B[sizeB++] = i % 10;
// 反转数组以得到正常的数字排列
for (int i = 0; i < sizeA / 2; i++) swap(A[i], A[sizeA - 1 - i]);
for (int i = 0; i < sizeB / 2; i++) swap(B[i], B[sizeB - 1 - i]);
// 计算最大公因数
arrayGCD(A, sizeA, B, sizeB, GCD, resultSize);
// 打印结果
cout << "最大公因数是:";
printArray(GCD, resultSize);
return 0;
}
void arrayGCD(int A[], int sizeA, int B[], int sizeB, int result[], int &resultSize) {
// 将较小的数赋值给B
if (sizeA < sizeB) swap(sizeA, sizeB), swap(A, B);
// 辗转相除法求GCD
while (sizeB > 0) {
addArray(A + sizeA - sizeB, sizeB, B, sizeB, result, resultSize);
if (result[0] == 0) break;
// 将余数赋值给A,继续下一次迭代
for (int i = 0; i < resultSize; i++) A[i] = result[i];
resultSize = sizeB;
}
// 将最终的GCD结果保存到result中
for (int i = 0; i < resultSize; i++) result[i] = A[i];
}
void addArray(int A[], int sizeA, int B[], int sizeB, int result[], int &resultSize) {
int maxLen = max(sizeA, sizeB);
resultSize = maxLen;
int carry = 0;
for (int i = 0; i < maxLen; i++) {
int valA = i < sizeA ? A[i] : 0;
int valB = i < sizeB ? B[i] : 0;
int sum = valA + valB + carry;
result[i] = sum % 10;
carry = sum / 10;
}
if (carry > 0) result[resultSize++] = carry;
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i];
}
cout << endl;
}
在这段代码中,我们定义了三个主要的函数:
arrayGCD
:这是主函数,它使用辗转相除法来计算两个大整数的最大公因数。addArray
:这个函数用来将两个数组相加,并处理进位。printArray
:这个函数用于打印数组。程序首先读取两个整数,然后将它们转换为数组形式。接下来,它调用 arrayGCD
函数来计算这两个数的最大公因数,并打印结果。请注意,这个程序假设输入的都是正整数。如果需要处理负数或前导零,可能需要添加额外的逻辑。