【问题标题】:How to find common prime factors of two given numbers in C?如何在C中找到两个给定数字的共同质因数?
【发布时间】:2020-07-29 18:49:56
【问题描述】:

我正在尝试解决这个问题:

输入:第一行包含一个整数T,它表示您需要解决的总案例。每个测试用例包含PQ,用空格隔开,代表你需要处理的数字。

输出:打印由PQ的最小因子和最大素因子相乘计算的结果。

约束:1 ≤ ???? ≤ 1002 ≤ ????,???? ≤ 1000000

示例输入:2 210 84 6 12
样本输出:

Case #1: 14 
Case #2: 6 

说明:我们以第一种情况为例。数字 210 和 84 有几个相同的质因数,分别是 2、3 和 7。数字“2”是数字中最小的公质因数,而数字“7”是它们最大的公质因数。所以,结果一定是 2 和 7 的乘积,也就是 14。

这是我一直在工作的代码,我试图从给定的数字中找到因子,然后将因子存储到数组中,然后检查素数,但我觉得这不是正确的算法:(

void factor(int num1) {
    int arrA[100000], a = 0, flag = 1;
    //check factor
    for (int i = 2; i <= num1; i++) {
        if (num1 % i == 0) {
            arrA[a] = i;
            a++;
        }
    }
    // check prime
    for (int i = 0; i < a; i++) {
        for (int j = 2; j < a; j++) {
            if ((arrA[i] % j) == 0) {
                flag = 0;
            }
        }
        if (flag == 1) {
            printf("%d ", arrA[i]);
        }
        flag = 1;
    }
    printf("\n");
}

【问题讨论】:

  • 这是一次素因数分解的尝试吗?
  • int arrA[100000] 已经处于灾难的边缘。将其移出堆栈。
  • 您可能还想将您的价值除以素数并重新运行您的因式分解以捕获所有因素。此外,无需检查所有素数 - 当 arrA[i] 平方大于您的因数时,您可以停止。
  • j &lt; a 替换为j &lt; arrA[i]。但是你的算法效率很低。
  • 只是一个建议:虽然很可爱,但整个第一段完全无关紧要。你真的应该考虑用与之前所说的类似的东西来替换它。保持与提出的问题相关的文本。

标签: c math primes


【解决方案1】:

您的函数无法正确计算质因数,因为它会找到非质因数。对于num = 6,它将找到23 以及6

当您发现i 整除num 时,您应该将num 除以i,否则增加i

然后您可以使arrA 更小,因为int 中的最大素因子数小于int 中的位数:31 足以满足 32 位整数和 @987654334 @ 表示 64 位整数。

一旦你得到了num 的质因数,你应该试着找出除以另一个数的最小和最大。请注意,第一个和最后一个这样的素数可能是相同的,或者如果这些数字没有共同的素因数,甚至可能不存在。

请注意,您不需要存储因子:对于num 的每个素因子,您可以尝试检查它是否除以另一个数字,并保留第一个除以和最后一个。

这是一个简单的实现:

#include <stdio.h>

int main() {
    int i, n, a, aa, b, p, p1, p2;

    if (scanf("%d", &n) == 1) {
        for (i = 1; i <= n; i++) {
            if (scanf("%d%d", &a, &b) != 2)
                break;
            p1 = p2 = 1;
            aa = a;
            for (p = 2; p * p <= aa; p++) {
                if (aa % p == 0) {
                    /* p is a prime factor of a */
                    if (b % p == 0) {
                        /* p is a common prime factor */
                        p2 = p;
                        if (p1 == 1) {
                            /* p is the smallest common prime factor */
                            p1 = p;
                        }
                    }
                    /* remove p as a factor of aa */
                    do { aa /= p; } while (aa % p == 0);
                }
            }
            if (aa > 1) {
                /* aa is the largest prime factor of a */
                if (b % aa == 0) {
                    /* aa is the largest common prime factor */
                    p2 = aa;
                    if (p1 == 1) {
                        /* aa is also the smallest common prime factor */
                        p1 = aa;
                    }
                }
            }
            /* print the product of the smallest and largest common prime factors */
            /* if a == b and a is a large prime, a * a might overflow int */
            printf("Case #%d: %lld\n", i, (long long)p1 * p2);
        }
    }
    return 0;
}

【讨论】:

  • 这是干什么用的? if (a > 1) { if (b % a == 0) { /* a 是最大的质因数 */ if (p1 == 1) p1 = a; p2 = 一个; } }
  • @selowboi:在因式分解循环结束时,a 的最终值是最大的质因数,如果已经找到了大于 1 的最大因数,则1 的最终值。如果它还除以b,则此测试会处理此因素。我用解释性 cmets 和更好的分解循环更新了代码。
猜你喜欢
  • 2013-04-11
  • 1970-01-01
  • 2017-02-15
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
相关资源
最近更新 更多