【问题标题】:Finding common prime divisors寻找共同的主要因数
【发布时间】:2019-01-17 16:35:41
【问题描述】:

我编写了一个程序来查找公约数、最大公约数和最小公约数。我的方法是先找到gcd,然后将gcd分解成素数。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int prime(int x) {
    int y;
    for (y = 2; y < x; y++) {
        if (x % y != 0)
            continue;
        else
            return 1;
    }
    return 0;
}
int main() {
    int n, m, i, gcd, lcm, k;
    // Input m and n
    printf("Enter m = ");
    scanf("%d",&m);
    printf("Enter n = ");
    scanf("%d",&n);
    // Common prime divisors
    lcm = m * n;
    while (m != n)
        if (m > n) m = m - n;
        else n = n - m;
    gcd = m;
    lcm = lcm / gcd;
    if (m <= 1)
        printf("No common prime divisors");
    else {
        printf("Common prime divisors: ");
        for (i = 2; i <= m - 1; i++) {
            k = prime(i);
            if (k = 1)
                if (m % i == 0)
                    printf("%d  ", i);
        }
    }
    printf("\nGreatest common divisor: %d\nLeast common multiple: %d", gcd, lcm);
    return 0;
}

该程序似乎正在运行,但是当我输入 m = 2 和 n = 4 时,本应为 '2' 的公约数并没有出现。
那么我的代码有什么问题呢?

【问题讨论】:

  • 这确实是一个调试器可以帮助解决的好案例。
  • 2 和 4 的 gcd 是多少?你介意素数的更高次幂吗?
  • 为什么函数中没有 GCD?您的主要功能效率不高。当数字不是素数时它也返回 1,当它是 0 时,这与正常的 C 约定相反(当它是素数时返回 1 或 true;当不是素数时返回 0 或 false)。但是,这些不是您的直接问题。
  • @Yunnosch 什么都没有

标签: c


【解决方案1】:

如果m = 2,那么下面的循环不能执行,因为2-1 = 1i2开始。

for (i = 2; i <= m - 1; i++) 

另外,if (k=1) 是一个赋值。你想要if (k==1)

【讨论】:

  • 也许我需要再添加一行if (m = 2) printf("Common prime divisors: 2");
  • 它不起作用。当我输入 39 时,我得到了同样的结果
  • 我认为当我将i &lt;= m - 1 修复为i &lt;= m 时它可以工作
猜你喜欢
  • 2012-08-09
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多