我正在尝试编写一个确定数字是否与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();
}
}
}
}
您发送给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);