• 智能AI问答!更聪明、更完整、原创作!
  • 一款基于GPT的超级AI机器人,可以回答问题、聊天、创作、写文案!

写一个C++程序,功能:输入两个数,利用高精度算法求他们的最大公因数,不用库函数

发布于 2024-06-18 17:42:14

下面是一个不使用库函数的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 函数来计算这两个数的最大公因数,并打印结果。请注意,这个程序假设输入的都是正整数。如果需要处理负数或前导零,可能需要添加额外的逻辑。

0 条评论

发布
问题

在线
客服