嵌套循环 - 使用一个循环的结果,打印结果,然后通过另一个循环发送结果

问题描述 投票:0回答:2

我正在编写一个代码,用户输入min max并查找该范围内的所有非素数并显示每个数字。然后我需要显示每个非素数素因子。

以下是min = 6 max = 9的示例:

6:2:3   
8:2:2:2   
9:3:3   

我的问题是我认为嵌套我的代码。

for (x = min; x <=max; x++)
{
   for (y= 2; y <= (x/y); y ++)
      if (x % y == 0)
       textBox3.Text += x + " : \r\n";
//the above block of code will go through my min max list and display all non primes

   int z;
    for (z = 2; z <= (x/z); z++)
       if (x % z == 0) break;
       if (z > (x/z))
        textBox4.Tex += x + " : \r\n";
  //the above block of code will list all primes between MIN and MAX `

我的问题是我需要应用第二个代码块才能应用于第一部分的结果。我只需要找到minmax之间每个非素数的素因子。

即,如果我的最小最大范围中的第一个数字是6(非素数),那么将列出该数字然后通过第二个块,然后确定并输出数字1 - 6的素数因子。

对不起,文字墙和可能格式不好这是我在这里发布的第一次真实尝试。

更新:

  for (x = min; x <= max; x++)
            {
            if (x % 2 == 0 || x % 3 == 0)
                {
                textBox3.Text += x + " : \r\n";
                //returns non prime numbers
                }

                int z;
                for (z = 2; z <= (x / z); z++)
                   if (x % z == 0) break;
               if (z > (x / z))
                    textBox4.Text += x + " : \r\n";
                //returns prime numbers

在与我的教授交谈之后,我发现我的问题是我的非素数if语句的x流不能被下一个for循环跟踪。

我必须弄清楚如何链接非素数x并继续循环通过测试素数的循环,我无法弄清楚如何建立连接。

c# loops nested nested-loops primes
2个回答
0
投票

不确定我是否正确理解了你的问题,但是你的意思是你只想在第一部分非素数的情况下执行代码的第二部分。使用您的代码,这是您想要的吗?

for (x = min; x <=max; x++)
{
   for (y= 2; y <= (x/y); y ++)
      if (x % y == 0) 
        {   // Changed. Second code runs only if non-prime
            textBox3.Text += x + " : \r\n";
            //the above block of code will go through my min max list and display all non primes
            int z;
            for (z = 2; z <= (x/z); z++)
                if (x % z == 0) break;
                    if (z > (x/z))
                        textBox3.Text += x + " : \r\n";
  //the above block of code will list all primes between MIN and MAX `
        } // Changed
}

0
投票

不要把所有东西塞进一个难以维护的方法中;保持简单,提取方法:

private static List<int> PrimeDivisors(int value) {
  List<int> result = new List<int>();

  if (value <= 1) // Special case: 1, 0 or negatives: no divisors
    return result;

  for (; value % 2 == 0; value /= 2) // Optimization: even numbers
    result.Add(2);

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

  for (int i = 3; i <= n; ) 
    if (value % i == 0) {
      result.Add(i);
      value /= i;

      n = (int)(Math.Sqrt(value) + 0.5);
    }
    else
      i += 2;

  if (value > 1)
    result.Add(value);

  return result;
}

实现此方法后,您可以轻松完成主要任务:

 StringBuilder sb = new StringBuilder();

 for (int x = min; x <= max; ++x) {
   var divisors = PrimeDivisors(x);

   if (divisors.Count > 1) {
     if (sb.Length > 0)
       sb.AppendLine();

     sb.Append($"{x}:{string.Join(":", divisors)}");
   } 
 } 

 textBox4.Text = sb.ToString();

结果(提供qazxsw poi,qazxsw poi和qazxsw poi是多线min == 6):

max == 9
© www.soinside.com 2019 - 2024. All rights reserved.