Вывод неправильного значения из цикла do while - PullRequest
1 голос
/ 02 февраля 2020

Я пытаюсь написать программу, которая определяет, является ли число взаимно простым с номером euiler. Я реализовал al oop, который сообщает пользователю, является ли введенное число взаимно простым с номером euiler, если это не так, он заставляет их вводить другое число, пока оно не будет взаимно простым. Однако, когда я тестирую программу, если я ввожу число, не являющееся взаимно простым, для начала, а затем ввожу число взаимной простоты, вывод числа показывает исходное число, которое я ввел (число, которое не является взаимно простым). Я не понимаю, почему он выводит неправильный номер.

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using static System.Math;
 using System.Numerics;

 namespace euiler
{
class Program
{
    class GFG
    {
        static BigInteger _gcd(BigInteger e, BigInteger euiler)
        {
            // Everything divides 0 
            if (e == 0 || euiler == 0)
                return 0;
            if (e == euiler)
                return e;

            if (e > euiler)
                return _gcd(e - euiler, euiler);
            return _gcd(e, euiler - e);
        }
        static void coprime(BigInteger e, BigInteger euiler)
        {
            if (_gcd(e, euiler) == 1)
                Console.WriteLine("Co-Prime");
            else
            do
            {
                Console.WriteLine("Not Co-Prime");
                Console.WriteLine("Please enter another number which is Co-Prime");
                e = BigInteger.Parse(Console.ReadLine());
                coprime(e, euiler);

            } while (_gcd(e, euiler) != 1);
        }

            static void Main(string[] args)
            {
                BigInteger p;
               p = BigInteger.Parse(Console.ReadLine());
                BigInteger q;
                q = BigInteger.Parse(Console.ReadLine());

                BigInteger euiler = (p - 1) * (q - 1); 

                BigInteger e; 
                Console.WriteLine("What is e?");
                e = BigInteger.Parse(Console.ReadLine());
                coprime(e, euiler);

                Console.WriteLine("euiler number is = " + euiler);
                Console.WriteLine();
                Console.WriteLine("e must be co-prime to the euiler 
                number");
                Console.WriteLine();
                Console.WriteLine("e = " + e);
                Console.WriteLine();                               
            }
        }
    }
}

1 Ответ

3 голосов
/ 02 февраля 2020

Параметр "e", который вы отправляете в функцию взаимной простоты, передается как тип значения, поэтому любое изменение, которое вы делаете в нем, не меняет "e" в основной функции, если вы хотите сделать это, вам нужно передать его ref.

Измените свой код следующим образом

Функция взаимной поддержки:

static void coprime(ref BigInteger e, BigInteger euiler)
{
    if (_gcd(e, euiler) == 1)
        Console.WriteLine("Co-Prime");
    else
    do
    {
        Console.WriteLine("Not Co-Prime");
        Console.WriteLine("Please enter another number which is Co-Prime");
        e = BigInteger.Parse(Console.ReadLine());
        coprime(ref e, euiler);
    } while (_gcd(e, euiler) != 1);
}

Вызов на основной:

coprime(ref e, euiler);
...