【发布时间】:2020-05-14 22:53:24
【问题描述】:
用户输入两个质数,然后将它们相乘,完成另一个 (a-1) * (b-1) 的计算(a 和 b 是输入的质数)。检查输入的数字的功能,如果数字不是质数,将要求用户重新输入数字。但是,当我对此进行测试时,我注意到如果用户输入一个不是素数的数字,然后重新输入一个素数,则计算是基于这个不是素数的数字。例如。如果用户输入 2 和 4,由于 4 不是质数,他们被要求输入另一个数字,例如 3,计算将基于数字 2 和 4。
我该如何纠正这个问题,以便它采用有效的质数而不是最初输入的无效数字?
namespace example
{
class Program
{
class Co_P
{
static void coprime(ref int c, int calculation)
{
if (gcd(c, calculation) == 1)
Console.WriteLine("it's Co-Prime");
else
do
{
Console.WriteLine("it isn't Co-Prime");
Console.WriteLine("Enter a Co-Prime");
c = int.Parse(Console.ReadLine());
coprime(ref c, calculation);
} while (gcd(c, calculation) != 1);
}
static int Prime_a(int a) //check a is prime
{
if (a <= 1) return 0;
for (int i = 2; i <= a / 2; i++)
{
if (a % i == 0)
{
return 0; //not prime
}
}
return 1;
}
static void result(int a) //outputs if a is prime/or not
{
if (Prime_a(a) != 0)
{
Console.WriteLine(a + " is a prime number");
}
else do
{
Console.WriteLine(a + " isn't prime number");
Console.WriteLine();
Console.WriteLine("Please make sure you enter a prime number");
a = int.Parse(Console.ReadLine());
} while (Prime_a(a) == 0);
}
static int Prime_b(int b)
{
if (b <= 1) return 0;
for (int i = 2; i <= b / 2; i++)
{
if (b % i == 0)
{
return 0;
}
}
return 1;
}
static void resultb(int b)
{
int result = Prime_b(b);
if (Prime_b(b) != 0)
{
Console.WriteLine(b + " is a prime number");
}
else do
{
Console.WriteLine(b + " is not a prime number");
Console.WriteLine("Please make sure you enter a prime number");
b = int.Parse(Console.ReadLine());
} while (Prime_b(b) == 0);
}
static void Main(string[] args)
{
int a;
Console.WriteLine("Enter a prime number for a");
a = int.Parse(Console.ReadLine());
Console.WriteLine();
result(a);
Console.WriteLine();
int b;
Console.WriteLine("Enter a prime number for b");
b = int.Parse(Console.ReadLine());
Console.WriteLine();
resultb(b);
Console.WriteLine();
int total = a * b;
Console.WriteLine("The total of the prime numbers is = " + total);
int calculation = (a - 1) * (b - 1); //calculation
Console.WriteLine();
Console.WriteLine("The result = " + calculation);
Console.WriteLine();
}
}
}
【问题讨论】:
-
static void resultb(int b)b 是方法范围的本地。您可以更改它,但更改不会反映在调用范围中。查找“按值传递”。 -
您可能想了解变量的范围。如果您使用调试器逐步执行程序,您会发现在非主输入的情况下,
result()或resultb()范围内的变量设置为新输入,而不是@987654326 范围内的变量@。从设计的角度来看,在两(三)个地方读取输入也很奇怪。要么有一个读取输入并将其返回给Main()的方法,要么在Main()中完全处理输入。 -
那么你就不需要两者了,
Prime_a()和Prime_b()他们在做同样的事情。result()和result_b()也是如此。 -
对于
Prime_a()(或Prime_b()),您应该考虑返回bool而不是int。 -
无关:请不要标记垃圾邮件。 “primes”和“gcd”都不是问题的一部分。
标签: c# pass-by-reference primes greatest-common-divisor