【问题标题】:Function to check numbers are prime numbers检查数字是素数的功能
【发布时间】:2020-02-01 22:41:45
【问题描述】:

我需要能够检查用户输入的两个数字(pq)是否为质数,如果它们不是质数,则要求用户重新输入质数直到为pq 输入了质数。如果我输入一个不是素数的数字,我会被要求输入另一个数字,如果我第二次输入一个素数,它会告诉我这个素数不是素数。我该如何纠正这个问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;
using System.Numerics;

namespace primenumbers
{
class Program
{
int Check_Prime(BigInteger p)         
        {
            if (p <= 1) return 0;
            for (int i = 2; i <= p / 2; i++)
            {
                if (p % i == 0)
                {
                    return 0; //not a prime number
                }
            }
            return 1;
        }

        static void  result (BigInteger p)
        {
            int result = Check_Prime(p);
            if (Check_Prime(p) != 0)
            {
                Console.WriteLine(" is a prime number");                    
            }

           else  do
            {
                    Console.WriteLine(" is not a prime number");
                    Console.WriteLine("Please enter a prime number");
                    p = BigInteger.Parse(Console.ReadLine());

                } while (result == 0);                
        }
        static int Check_Prime_Q(BigInteger q)

        {
            if (q <= 1) return 0;
            for (int i = 2; i <= q / 2; i++)
            {
                if (q % i == 0)
                {
                    return 0; //not a prime number
                }
            }
            return 1;
        }

        static void resultq(BigInteger q)
        {
            int result = Check_Prime_Q(q);

            if (Check_Prime_Q(q) != 0)
            {
                Console.WriteLine(" is a prime number");
            }

            else do
                {
                    Console.WriteLine(" is not a prime number");
                    Console.WriteLine("Please enter a prime number");
                    q = BigInteger.Parse(Console.ReadLine());

                } while (result == 0);
        }

        static void Main(string[] args)
        {
            BigInteger p; // = 61; //value of p

            Console.WriteLine("Enter a prime number for p");
            p = BigInteger.Parse(Console.ReadLine());
          result(p);


            BigInteger q; //53; //value of q

            Console.WriteLine("Ener a prime number for q");
            q = BigInteger.Parse(Console.ReadLine());
            resultq(q);
            result(p);

            BigInteger n = p * q; // calculation for n

            Console.WriteLine("p = " + p);
            Console.WriteLine();
            Console.WriteLine("q = " + q);
            Console.WriteLine();
            Console.WriteLine("n = " + n);

    }
}

}

【问题讨论】:

  • 你做的工作太多了;你只需要检查sqrt(p),至少;见primality tests

标签: c# loops primes do-while


【解决方案1】:

除了代码中的许多东西可以改进(例如命名、返回值、pq 误入Main)之外,主要问题就在这里。您将i 递增到p/2,然后您正在检查if (i == p),这永远不会是真的(p = 0 除外)

static int Check_Prime(BigInteger p)
{
    int i;
    for (i = 2; i <= p /2; i++)
    {
        if (p % i == 0)
        {
            return 0; //not a prime number
        }
    }
    if (i == p) // never true except p == 0
    {
        return 1;
    }
    return 0; // always returns 0
}

只需删除if 语句并返回1

static int Check_Prime(BigInteger p)
{
    if (p <= 1) return 0;
    for (int i = 2; i <= p /2; i++)
    {
        if (p % i == 0)
        {
            return 0; //not a prime number
        }
    }
    return 1;
}

【讨论】:

  • 我已经做到了,但是如果我故意输入一个不是质数的数字,然后输入一个质数,它会告诉我质数不是质数?
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多