【问题标题】:Using correct number in calculation c#在计算c#中使用正确的数字
【发布时间】: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


【解决方案1】:

你应该扩展resultresultb函数,让它返回新的提示有效数字

static int result(int a) {
  var result = Prime_a(a);
  if (result != 0)
  ...code...
  return result
}

也不要忘记重新分配这些值

  ...code...
  a = result(a);
  ...code...
  b = resultb(b);

【讨论】:

  • 什么意思?
  • 是的,我知道。这就是为什么我在挣扎。你的回答没有错。但真的“够”了吗?我们不能给他一个初学者的教程....啊,我感觉很糟糕。
  • result(int a)中的static这一行,result这个词用红色高亮,错误“Program.Co_Prime.result(int)': not all code paths return a value ?
  • 这意味着值在条件内返回,但不在条件外,反之亦然
【解决方案2】:
        int b;
        Console.WriteLine("Enter a prime number for b");
        b = int.Parse(Console.ReadLine());
        Console.WriteLine();
        resultb(b);
        Console.WriteLine();

resultb(b); 行中,您将int 传递给方法resultbint 是一个值类型,或者换句话说,将int 传递给一个方法意味着将它的值传递给一个方法,在该方法中创建该值的副本。在这种情况下,b 的副本在方法 resultb 中创建。方法 resultb 内部对 b 的任何进一步更改都是在副本上进行的,原始内容保持不变。

resultb 方法中通过添加ref 关键字通过引用 传递参数。而是

static void resultb(int b)
{
    // code
}

方法如下所示

static void resultb(ref int b)
{
    // code
}

你会这样调用方法

resultb(ref b);

这是代码部分。

    int b;
    Console.WriteLine("Enter a prime number for b");
    b = int.Parse(Console.ReadLine());
    Console.WriteLine();
    resultb(ref b);
    Console.WriteLine();

现在,通过 b 内部方法 resultb 的每个更改都将反映在原始方法上。

您应该对方法 result(int a) 执行相同的操作。

【讨论】:

  • 为什么不直接返回一个int? out 参数确实有它们的位置。然而,这并不合适。
  • @Fildor 这种方式比较优雅。
  • @Fildor 我已经使用 ref 关键字更正了答案。 @Rubikted 我已经添加了解释。您只需要更改方法resultb的签名即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多