Как написать простой Java-программы, которая находит наибольший общий делитель двух чисел? [дубликат]
этот вопрос уже есть ответ здесь:
- как найти GCD, LCM на наборе чисел 13 ответов
вот вопрос:
"написать метод с именем НОД, которая принимает два целых числа в качестве параметров и возвращает наибольший общий делитель двух чисел. Наибольший общий делитель (GCD) двух числа A и B-это наибольшее целое число, которое является фактором A и B. НОД любого числа и 1-1 и НОД любого числа а 0-это число.
одним из эффективных способов вычисления GCD двух чисел является использование алгоритма Евклида, который гласит следующее:
GCD(A, B) = GCD(B, A % B)
GCD(A, 0) = Absolute value of A"
Я правда не знаю, как решить эту проблему. Мне просто нужны некоторые подсказки и советы о том, что я сделал неправильно в программе, которую я до сих пор. (Я должен поставить сканер, это мой учитель требование.) Не давайте мне полный код, так как я хочу решить это сам. Может быть, просто дайте мне подсказку о том, как я включаю эту формулу, которую вы видите выше. (И если вам интересно, почему я поставил == 0, это потому, что я думал, что если у вас есть два числа, скажем 0 и 90, их GCD будет 0 правильно??)
кроме того, мой код должен включать циклы while...Я бы предпочел, если бы петли...
спасибо заранее! :)
моя текущая программа:
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
gcd (a, b);
}
public static void gcd(int a, int b) {
System.out.print("Type in two numbers and I will print outs its Greatest Common Divisor: ");
int gcdNum1 = console.nextInt();
int gcdNum2 = console.nextInt();
while (gcdNum1 == 0) {
gcdNum1 = 0;
}
while (gcdNum2 > gcdNum1) {
int gcd = gcdNum1 % gcdNum2;
}
System.out.print(gcdNum1 + gcdNum2);
}
}
8 ответов
рекурсивный метод будет:
static int gcd(int a, int b)
{
if(a == 0 || b == 0) return a+b; // base case
return gcd(b,a%b);
}
использование цикла while:
static int gcd(int a, int b)
{
while(a!=0 && b!=0) // until either one of them is 0
{
int c = b;
b = a%b;
a = c;
}
return a+b; // either one is 0, so return the non-zero value
}
когда я вернусь a+b
, Я фактически возвращаю ненулевое число, предполагая, что один из них равен 0.
вы также можете сделать это в три строки:
public static int gcd(int x, int y){
return (y == 0) ? x : gcd(y, x % y);
}
здесь, если y = 0
, х возвращается. В противном случае gcd
метод вызывается снова, с различными значениями параметров.
import java.util.Scanner;
public class Main {
public static void main(String [] args)
{
Scanner input = new Scanner(System.in);
System.out.println("Please enter the first integer:");
int b = input.nextInt();
System.out.println("Please enter the second integer:");
int d = input.nextInt();
System.out.println("The GCD of " + b + " and " + d + " is " + getGcd(b,d) + ".");
}
public static int getGcd(int b, int d)
{
int gcd = 1;
if(b>d)
{
for(int i = d; i >=1; i--)
{
if(b%i==0 && d%i ==0)
{
return i;
}
}
}
else
{
for(int j = b; j >=1; j--)
{
if(b%j==0 && d% j==0)
{
return j;
}
}
}
return gcd;
}
}
один из способов сделать это код ниже:
int gcd = 0;
while (gcdNum2 !=0 && gcdNum1 != 0 ) {
if(gcdNum1 % gcdNum2 == 0){
gcd = gcdNum2;
}
int aux = gcdNum2;
gcdNum2 = gcdNum1 % gcdNum2;
gcdNum1 = aux;
}
для этого не требуется рекурсия.
и будьте осторожны, он говорит, что когда число равно нулю, то GCD-это число, которое не равно нулю.
while (gcdNum1 == 0) {
gcdNum1 = 0;
}
вы должны изменить это, чтобы выполнить требование.
Я не собираюсь рассказывать вам, как полностью изменить ваш код, только как вычислить gcd.
private static void GCD(int a, int b) {
int temp;
// make a greater than b
if (b > a) {
temp = a;
a = b;
b = temp;
}
while (b !=0) {
// gcd of b and a%b
temp = a%b;
// always make a greater than bf
a =b;
b =temp;
}
System.out.println(a);
}
import java.util.Scanner;
class CalculateGCD
{
public static int calGCD(int a, int b)
{
int c=0,d=0;
if(a>b){c=b;}
else{c=a;}
for(int i=c; i>0; i--)
{
if(((a%i)+(b%i))==0)
{
d=i;
break;
}
}
return d;
}
public static void main(String args[])
{
Scanner sc=new Scanner(System.in);
System.out.println("Enter the nos whose GCD is to be calculated:");
int a=sc.nextInt();
int b=sc.nextInt();
System.out.println(calGCD(a,b));
}
}
теперь, я только начал программировать около недели назад, так что ничего необычного, но у меня была проблема и я придумал это, что может быть проще для людей, которые только начинают программировать, чтобы понять. Он использует метод Евклида, как и в предыдущих примерах.
public class GCD {
public static void main(String[] args){
int x = Math.max(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
int y = Math.min(Integer.parseInt(args[0]),Integer.parseInt(args[1]));
for (int r = x % y; r != 0; r = x % y){
x = y;
y = r;
}
System.out.println(y);
}
}