Я пытаюсь вычислить наибольший общий делитель, используя while loop. Поэтому я ищу наибольшее число (т.е. последнее значение цикла). Как мне избавиться от предыдущих чисел?

Пример: Наибольший общий делитель 84 и 18 равен 6. Однако мой код дает мне числа 2, 3 и 6. Что мне нужно изменить, чтобы получить только последнее число?

using System;

namespace CalculateGCD
{
    class Program
    {
        static void Main(string[] args)
        {

            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());


            int i = 1;

          while (i <= Math.Min(a, b))
            {             
                i++;

                if (a % i == 0 && b % i == 0)
                {
                    Console.WriteLine("GCD:{0}", i);
                }             
            }

        }

    }
}
1
VaVa 2 Май 2016 в 18:32

5 ответов

Лучший ответ

Определите переменную с именем max, затем выведите max из цикла while следующим образом:

int max = 0;

while (i <= Math.Min(a, b))
{
     i++;

     if (a % i == 0 && b % i == 0)
     {
          max = i;
     }
}
Console.WriteLine("GCD:{0}", max);

Также, если вы используете C # 6, вы можете упростить свой Console.WriteLine, используя интерполяцию строк следующим образом:

Console.WriteLine($"GCD:{max}");
5
Salah Akbari 2 Май 2016 в 16:10
int gcd;
while (i <= Math.Min(a, b))
{             
    i++;
    if (a % i == 0 && b % i == 0)
    {
        gcd=i;
    }             
}
Console.WriteLine("GCD:{0}",gcd);

Сохраните наибольший общий делитель в переменной.

1
Salah Akbari 19 Окт 2017 в 13:01

Просто переверните последовательность перечисления будет делать

int a = int.Parse(Console.ReadLine());
int b = int.Parse(Console.ReadLine());
int i = Math.Min(a ,b);
while (i > 1)
{
  if (a % i == 0 && b % i == 0)
  {
      Console.WriteLine("GCD:{0}", i);
      break;//greatest will be the first
  }
  i--;
 }
1
Akshita 2 Май 2016 в 15:55

Вы можете инвертировать цикл, вместо перехода от 1 к Мин между a и b, ищите от Мин до 1.

int i = Math.Min(a, b);
while (i > 0)
{
    i--;

    if (a % i == 0 && b % i == 0)
    {
        Console.WriteLine("GCD:{0}", i);
        break;
    }             
}
1
Fede 2 Май 2016 в 15:38

Есть простое решение, которое рассчитает НОД

static int GCD(int a, int b) {
    return b == 0 ? a : GCD(b, a % b);
}

И вы можете использовать его, как показано ниже

using System;

namespace CalculateGCD
{
    public class Program
    {
        public static void Main(string[] args)
        {

            int a = int.Parse(Console.ReadLine());
            int b = int.Parse(Console.ReadLine());


            Console.WriteLine(GCD(a,b));
        }

        static int GCD(int a, int b) 
        {
           return b == 0 ? a : GCD(b, a % b);
        }

    }
}
2
Mostafiz 2 Май 2016 в 15:51