C# - 获取平方根和最接近的素数

标签 c#

我正在尝试编写一个程序来获取输入的平方根和输入最接近的素数。我不知道在获取最近的素数时可能出现什么问题,但它没有返回正确的答案。

using System;

namespace SqrtPrime
{
class SqrtPrime
{
    static void Main(string[] args)
    {

        int num, ctr;
        Console.Write("Enter number: ");
        num = int.Parse(Console.ReadLine());
        int[] inp = new int[num];

        for (ctr = 0; ctr < num; ctr++)
        {
            Console.Write("\n\nEnter number {0}: ", ctr + 1);
            inp[ctr] = int.Parse(Console.ReadLine());
            double sqrt = Math.Sqrt(inp[ctr]);
            Console.Write("\nSquare root: {0} ", sqrt);
            int cnvt = inp[ctr];

            Console.Write("\nNearest prime number/s: ");
            int i, Prime1 = 0, Prime2 = 0;
            bool checkPrime1 = true, checkPrime2 = true;

            while (checkPrime1)
            {
                cnvt--;
                for (i = 2; i <= cnvt; i++)
                {
                    if (cnvt % i == 0)
                    {
                        break;
                    }
                }
                if (i == cnvt)
                {
                    checkPrime1 = false;
                    Prime1 = cnvt;
                    break;
                }
            }

            while (checkPrime2)
            {
                cnvt++;
                for (i = 2; i <= cnvt; i++)
                {
                    if (cnvt % i == 0)
                    {
                        break;
                    }
                }
                if (i == cnvt)
                {
                    Prime2 = cnvt;
                    checkPrime2 = false;
                    break;
                }
            }

            if (Prime2 - cnvt > cnvt - Prime1)
            {
                Console.WriteLine(Prime1);
            }

            else if (Prime2 - cnvt < cnvt - Prime1)
            {
                Console.WriteLine(Prime2);
            }

            else if (Prime2 - cnvt == cnvt - Prime1)
            {
                Console.WriteLine(Prime1 + ", " + Prime2);
            }
        }

        Console.ReadLine();
    }
}
}

最佳答案

我建议提取方法,首先是IsPrime

public static bool IsPrime(int value) {
  if (value <= 1)
    return false;
  else if (value % 2 == 0)
    return value == 2;

  int n = (int) (Math.Sqrt(value) + 0.5);

  for (int i = 3; i <= n; i += 2)
    if (value % i == 0)
      return false;

  return true;
}

然后primeBelowprimeAbove

private static int primeBelow(double value) {
  int n = (int) value;

  for (int i = n; i >= 2; --i)
    if (IsPrime(i))
      return i;

  return -1; // technical value, e.g. there's no prime below for sqrt(3)  
}

private static int primeAbove(double value) {
  int n = (int) value;

  for (int i = n; ; ++i)
    if (IsPrime(i) && (i > value))
      return i;

  return -1;   
}

最后,NearestPrime

private static string NearestPrime(double value) {
  int below = primeBelow(value);
  int above = primeAbove(value);

  if (below < 0)
    return above.ToString();

  if (Math.Abs(value - below) < Math.Abs(value - above)) 
    return below.ToString();
  else if (Math.Abs(value - below) > Math.Abs(value - above)) 
    return above.ToString();
  else 
    return string.Format("{0}, {1}", below, above);
}

然后使用它们

   ...
   double sqrt = Math.Sqrt(inp[ctr]);
   Console.Write("\nSquare root: {0} ", sqrt); 
   Console.WriteLine(NearestPrime(sqrt));

关于C# - 获取平方根和最接近的素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38267632/

相关文章:

c# - 由于缺少程序集,MEF 中的反序列化错误

c# - 为什么将日志记录到 log4net.ILog 附加到多个日志?

c# - 使用 SQL Server Graph 2017 获取两个节点之间的所有路径

c# - 如何使用泛型实现此功能?

C# 在多个线程上拆分循环

c# - 扩展结构的最简单方法(PointF)

c# - 声明 2 个相似的匿名对象

c# - 如何轻松替换 Microsoft Fakes 程序集?

c# - 如何连接到 Windows 8.1 上的 Azure Blob 存储?

java - 以图库 Intent 显示图像