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

问题描述 投票:0回答:2

我正在尝试编写一个确定数字是否与eeuler数字互质的程序。我实现了一个循环,该循环告诉用户输入的数字是否与eeuler数字互质,如果不是,则使他们输入另一个数字,直到互质。但是,当我测试程序时,如果我输入的数字不是以互素数开头,然后输入一个互素数,则该数字的输出将显示我输入的原始数字(不是互素数的数字)。我不明白为什么它输出错误的号码。

 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();                               
            }
        }
    }
}
c# loops do-while
2个回答
2
投票

您发送给coprime函数的参数“ e”作为值类型传递,因此,您对其所做的任何更改都不会更改主函数中的“ e”,如果要这样做,则需要通过ref传递它。

像这样改变鳕鱼

coprime函数:

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);
© www.soinside.com 2019 - 2024. All rights reserved.