Функция для проверки чисел простые числа - PullRequest
0 голосов
/ 02 февраля 2020

Мне нужно иметь возможность проверить, что два числа, введенные пользователем (p и q), являются простыми числами, и если они не являются простыми числами, то пользователю предлагается повторно ввести простое число пока простое число не будет введено для p и q. Если я ввожу число, которое не является простым числом, меня попросят ввести другое число, если я ввожу простое число во второй раз, оно говорит мне, что простое число не является простым числом. Как я могу исправить это.

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);

    }
}

}

1 Ответ

1 голос
/ 02 февраля 2020

Помимо того, что многие вещи в коде могут быть улучшены (например, именование, возвращаемые значения, p и q, ошибочно принятые в 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;
}
...