当前位置: 首页 > 知识库问答 >
问题:

在java中创建最大公约数的问题

闻人嘉颖
2023-03-14

我遵循了这个计算给我的逻辑,但它似乎只会给我一个无尽的循环。我能得到一些帮助吗?

我应该用的逻辑是:

求两个正整数x和y的最大公约数的公式遵循欧几里德算法如下:1。重复从y中减去x,直到y

这是我的代码

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package project4.pkg3;

/**
 *
 * @author LMFS
 */

import java.util.Scanner;

public class Project43 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        int numOne, numTwo;
        String c = "";
        Scanner sc = new Scanner(System.in);
        String another = "y";
        while (another.equalsIgnoreCase("y")) {
            System.out.println("Enter first number: ");
            numOne = sc.nextInt();
            System.out.println("Enter second number: ");
            numTwo = sc.nextInt();

            c = doMath(numOne, numTwo);

            //use static method here.
            System.out.println("Greatest common divisor: " + c);
            System.out.println();
            System.out.println("Continue? (y/n): ");
            another = sc.next();
        }

    }

    public static String doMath(int numOne, int numTwo) {
        while (numOne != 0) {
            System.out.println("//debugging line 48: " + numOne);
            while (numTwo > numOne) {
                numTwo -= numOne;
                System.out.println("//debugging line 52: " + numTwo);
            }
            while (numOne > numTwo) {
                numOne -= numTwo;
                System.out.println("//debugging line 57: " + numOne);
            }
        }
        return Integer.toString(numTwo);
    }
}

编辑:解决了,我把静态方法改成这样:

    public static int egcd(int a, int b) {
if (a == 0)
    return b;

while (b != 0) {
    if (a > b)
        a = a - b;
    else
        b = b - a;
    }

return a;
}

共有3个答案

袁文景
2023-03-14

在方法doMath中进行此修复:

// Until one of the numbers divides by other
while (numOne % numTwo != 0 && numTwo % numOne != 0) {

而不是:

while (numOne != 0) {

在回来之前做些改变

int result = numOne / numTwo == 0 ? numOne : numTwo;
return Integer.toString(result);

在控制台上,我得到了以下结果:

Enter first number: 
14
Enter second number: 
49
... some debugging log
Greatest common divisor: 7
缪征
2023-03-14

小贴士:我一直认为,当数字相等时,欧几里德算法就会失效。找到的号码是GCD。

另外,我认为在主计算循环中不需要几个循环。尝试用if语句替换它们。因此,更容易找到错误(尝试使用数字1和1运行程序)

于捷
2023-03-14

按照您实现算法的方式,无论是numOne还是numTwo都可以先达到零。但是,如果numTwonumOne之前达到零,那么doMath中的第二个嵌套循环将永远不会退出,因为该条件始终为真。

解决这个问题的一个方法就是

if (numTwo == 0) {
    return numOne;
}

在两个嵌套循环之间。

此外,我建议删除整数。toString从这个方法的返回中提取一部分,让它返回一个int整数,而不是字符串

 类似资料:
  • 问题内容: 我已经看到存在这样的功能,即。是否有在Java中的其它功能也适用于其他类型的工作(,或)?似乎这是有意义的(带有各种重载),但是它不存在。在别的地方吗? (请不要将此问题与“我如何自己实现”混淆!) 问题答案: 对于int和long而言,作为原语,并非如此。对于Integer,有人可能写了一个。 假设BigInteger是int,Integer,long和Long的(数学/函数)超集,

  • 我试图让这个程序计算两个用户输入的正整数(x和y)的最大公约数(GCD)。set函数不返回可以索引的列表。关于如何找到GCD有什么建议吗?

  • 计算两个或两个以上数字/数字数组的最大公约数。 内部的 _gcd 函数使用递归。基本情况是,当 y 等于 0 的情况下,返回 x 。否则,返回 y 的最大公约数和x / y的其余数。 const gcd = (...arr) => { const _gcd = (x, y) => (!y ? x : gcd(y, x % y)); return [...arr].reduce((a, b)

  • 本文向大家介绍java求最大公约数与最小公倍数的方法示例,包括了java求最大公约数与最小公倍数的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java求最大公约数与最小公倍数的方法。分享给大家供大家参考,具体如下: Gongyueshu.java文件: 此处需要由控制台输入参数,eclipse环境运行的设置步骤为Run》Run Configurations进入运行的调试配置界面

  • 我的任务是接受两个分数并求和,然后以最简单的形式返回。 出于某种原因,“gcd=i执行时不运行,因此我的程序在运行时进入无限循环。

  • Python3 实例 以下代码用于实现最大公约数算法: 实例(Python 3.0+)# Filename : test.py # author by : www.runoob.com # 定义一个函数 def hcf(x, y): """该函数返回两个数的最大公约数""" # 获取最小值 if x > y: smaller = y else: smaller = x for i in range