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

时间:2018-02-16 08:00:17

标签: c# loops nested nested-loops primes

我正在编写一个代码,该代码接受用户输入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并继续循环通过测试素数的循环,我无法弄清楚如何建立连接。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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();

结果(假设min == 6max == 9textBox4是多行TextBox):

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