繁体   English   中英

C#,试图从生成的数组中提取素数,我得到的是 0

[英]C#, Trying to pull prime numbers from generated array all I get is 0

该程序将生成一个随机选择的 1 - 100 之间的数字序列。该序列将由 20 个元素组成。 您的程序应在生成序列后显示该序列。 然后,它将显示该序列中的所有素数。

到目前为止的代码:

class Program

    {
        int[] rnum = new int[100];
        int[] selecting = new int[20];
        static void Main(string[] args)
        {
            Program myProgram = new Program();
            myProgram.Numbers();
            myProgram.PrimeN();
            Console.ReadLine();
        }
        public void Numbers()
        {
            int[] rnum = new int[100];
            // Filling the array with values 1 to 100:
            for (int i = 0; i < rnum.Length; i++)
            {
                rnum[i] = i + 1;
            }
            // Shuffling the elements of the array:
            Random rnd = new Random();
            for (int i = 0; i < rnum.Length; i++)
            {
                int j = rnd.Next(i, rnum.Length);
                int temp = rnum[i];
                rnum[i] = rnum[j];
                rnum[j] = temp;
            }
            // Selecting and presenting 20 numbers:
            int[] selecting = new int[20];
            for (int i = 0; i < 20; i++)
                selecting[i] = rnum[i];
            selecting.ToList().ForEach(i => Console.Write(i.ToString() + ", "));
            Console.WriteLine();
        }
        public void PrimeN()
        {
            
            List<int> primeNumbers = new List<int>();           
            for (int i = 0; i < selecting.Length; i++)
            {
                if (IsPrime(selecting[i]))
                {
                 
                    primeNumbers.Add(selecting[i]);
                }
            }
            Console.Write("Non-Prime Numbers:");
            for (int i = 0; i < primeNumbers.Count; i++)
            {
                Console.Write(primeNumbers[i] + " ");
  
            }
         
        }
        bool IsPrime(int number)
        {
            for (int i = 2; i < Math.Sqrt(number); i++)
            {
                if (number % i == 0) return false;
            }
            return true;
        }

    }
}

您在Numbers() selecting中创建了名为 selection 的局部变量。 此局部变量的 Scope 在Numbers() function 内。

当您尝试在PrimeN()中读取相同的变量时,它指的是全局定义的selecting变量。

由于全局selecting变量中没有存储任何内容,因此primeNumbers数组中的结果为 0。

为了解决这个问题,不要在Numbers() selecting中创建名为 selection 的局部变量,使用全局定义的变量,即在 class 级别定义的selecting

...

public void Numbers()
{
    ...
    // Selecting and presenting 20 numbers:
    //COMMENT BELOW LINE
    //int[] selecting = new int[20];
    
    for (int i = 0; i < 20; i++)
        selecting[i] = rnum[i];   //This will refer member which is defined globally
    selecting.ToList().ForEach(i => Console.Write(i.ToString() + ", "));
    Console.WriteLine();
}

我看到的第一个问题是,您正在创建局部变量,而不是使用您声明的实例成员,在您的方法运行后,什么都没有改变......这一切都发生在方法的本地。

注释掉下面几行,你已经声明了它们

public static void Numbers(int size)
{
   //int[] rnum = new int[size];

   ...

   //int[] selecting = new int[20];

虽然这一切都可以简化为

private static readonly Random _r = new Random();

static void Main(string[] args)
{
   var numbers = Generate(100);
   var selected = numbers.Take(20).ToArray();
   Console.WriteLine("Selected : " + string.Join(", ", selected));
   Console.Write("Primes : " + string.Join(",", selected.Where(IsPrime)));
   Console.ReadLine();
}

public static int[] Generate(int size)
{
   var numbers = Enumerable.Range(1, 100).ToArray();
   // Shuffling the elements of the array:
   for (var i = 0; i < numbers.Length; i++)
   {
      var j = _r.Next(i, numbers.Length);
      var temp = numbers[i];
      numbers[i] = numbers[j];
      numbers[j] = temp;
   }

   return numbers;
}

private static bool IsPrime(int number)
{
   for (var i = 2; i < Math.Sqrt(number); i++)
      if (number % i == 0) return false;
   return true;
}

Output

Selected : 92, 79, 1, 44, 83, 48, 70, 49, 80, 19, 27, 65, 50, 40, 20, 10, 68, 25, 9, 28
Primes : 79,1,83,49,19,25,9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM