C# 从do while循环输出不正确的值

C# 从do while循环输出不正确的值,c#,loops,do-while,C#,Loops,Do While,我正在写一个程序,确定一个数是否与e数互质。一个循环告诉用户,如果他们输入的数字是e数字的互质,如果不是,它会让用户输入另一个数字,直到它是互质。然而,当我测试这个程序时,如果我输入一个不是互质的数字,然后输入一个互质数字,这个数字的输出会显示我输入的原始数字(不是互质的数字)。我不明白为什么它输出了错误的号码 namespace example { class Program { class GFG { static BigInteger _gcd(BigIn

我正在写一个程序,确定一个数是否与e数互质。一个循环告诉用户,如果他们输入的数字是e数字的互质,如果不是,它会让用户输入另一个数字,直到它是互质。然而,当我测试这个程序时,如果我输入一个不是互质的数字,然后输入一个互质数字,这个数字的输出会显示我输入的原始数字(不是互质的数字)。我不明白为什么它输出了错误的号码

 namespace example
{
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);
        }

        }
    }
}
发送给互质函数的参数“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);
发送给互质函数的参数“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);

我还注意到,如果我输入两次不正确的值,然后输入一个正确的值,它不会继续程序的其余部分,它会说它是互质,但会一直要求一个互质数。你可能需要重新阅读gcd计算方法。在递归方法中使用递归和循环可能会使事情过于复杂。你是故意这么做的吗?我认为你对这个问题的解决方案到处都是,因此编码解决方案也到处都是。因此,调试也是一个挑战。我还注意到,如果我输入两次不正确的值,然后输入一个正确的值,它不会继续程序的其余部分,它会说它是互质,但会不断询问互质数。您可能想重新了解gcd计算方法。在递归方法中使用递归和循环可能会使事情过于复杂。你是故意这么做的吗?我认为你对这个问题的解决方案到处都是,因此编码解决方案也到处都是。因此,调试也是一项挑战。