【问题标题】:How to find out if two numbers are relatively prime?如何判断两个数是否互质?
【发布时间】:2015-04-18 23:17:09
【问题描述】:

我正在尝试编写一种方法来计算两个数字是否是相对质数的分配。我主要是在寻找从哪里开始的答案。我知道有一种方法 gcd() 可以为我做很多事情,但任务几乎让我在没有 gcd 或数组的情况下完成它。

我已经开始了,因为我知道我必须在 for 循环中使用 % 运算符。

public static boolean relativeNumber(int input4, int input5){
    for(int i = 1; i <= input4; i++)

显然,此方法只会返回 truefalse,因为 main 函数只会根据两个数字是否互质而打印特定的行。

我想我可能必须编写两个for 循环,分别用于input4input5,可能还有某种带有逻辑&amp;&amp; 操作数的if 语句,但我'我不确定。

【问题讨论】:

    标签: java primes


    【解决方案1】:

    Swift 4@williem-van-onsem 答案的代码;

    func gcd(a: Int, b: Int) -> Int {
        var b = b
        var a = a
        var t: Int!
    
        while(b != 0){
            t = a;
            a = b;
            b = t%b;
        }
        return a
    }
    
    func relativelyPrime(a : Int, b: Int) -> Bool{
        return gcd(a: a, b: b) == 1
    }
    

    用法;

    print(relativelyPrime(a: 2, b: 4)) // false
    

    【讨论】:

      【解决方案2】:

      如果它们是互质的,那么最大的公除数就是一,因为——如果不是的话——两个数都可以除以那个数。所以我们只需要一个算法来计算最大公约数,例如Euclid's method

      private static int gcd(int a, int b) {
          int t;
          while(b != 0){
              t = a;
              a = b;
              b = t%b;
          }
          return a;
      }
      

      然后:

      private static boolean relativelyPrime(int a, int b) {
          return gcd(a,b) == 1;
      }
      

      Euclid 算法O(log n) 中工作,因此比枚举所有可以优化为 O(sqrt n) 的潜在除数要快得多.

      【讨论】:

      • 虽然这很有帮助,但我无法在这个作业中使用 gcd 方法,尽管我的教授给了我提前阅读和学习的道具,
      • @Tony:你可以自己简单地实现(添加第一个代码片段)。 gcd - 据我所知 - 没有在 Java 标准库中实现。
      【解决方案3】:
      package stack;
      
      import java.util.Scanner; //To read data from console
      
      /**
      *
      * @author base
      */
      public class Stack {
      
          /**
          * @param args the command line arguments
          */
          public static void main(String[] args) {
              Scanner in = new Scanner(System.in); // with Scanner we can read data
              int a = in.nextInt(); //first variable
              int b = in.nextInt(); //second variable
              int max; // to store maximum value from a or b
              //Let's find maximum value
              if (a >= b) {
                  max = a;
              } else {
                  max = b;
              }
              int count = 0; // We count divisible number
              for (int i=2; i<=max; i++) { // we start from 2, because we can't divide on 0, and every number divisible on 1
                  if (a % i == 0 && b % i==0) {
                      count++; //count them
                  }
              }
              if (count == 0) { // if there is no divisible numbers
                  System.out.println("Prime"); // that's our solutions
              } else {
                  System.out.println("Not Prime"); //otherwise
              }
          }
      }
      

      我认为,这是简单的解决方案。在 cmets 中提问。

      【讨论】:

      • 请解释您的答案,特别是因为 OP 是为分配而做的。如果他复制/粘贴你的代码,他什么也学不到。
      • 虽然这是真的,但我实际上学到了很多东西。我没有想到启动最大值会减少程序必须做的工作量。此外,他确实以一种我不会想到的方式使用了逻辑 && 运算符。我也没有想到使用计数并将计数条件设为 0 显然会将其确定为素数。这更像是一个逻辑问题。我可以很好地理解编码。我非常感谢 Beezy 的提交和 kittycat3141 解决我的学习经历的问题。
      • @kittycat3141,嗯,他让我教他吗?就是这样,您可以在其中提出您遇到的问题,并为他们找到答案。
      • @Tony:实际上,您已经可以在 sqrt(min(a,b)) 处停止,这将极大地提高该算法的性能(如果原始运行需要 10 秒耗时 100 秒)。此外,从您找到此类元素的那一刻起,您可以break。最后一个更好地使用Math.max,因为这允许非分支代码。
      • @Beezy 您添加的 cmets 很好。恕我直言,here iz teh codez 的答案和send me teh codez 的问题一样糟糕(这个问题不是)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 2011-04-06
      • 2019-09-07
      相关资源
      最近更新 更多