【问题标题】:Twin Prime Number in C loop is only giving first valueC循环中的双素数只给出第一个值
【发布时间】:2020-03-24 09:37:15
【问题描述】:

代码如下:

#include<stdio.h>

void main() {
  int num1, num2, num3, fac1 = 0, fac2 = 0, fac3 = 0, i;
  clrscr();
  for (num1 = 5; num1 < 100; num1 = num1 + 1) {
    for (i = 1; i <= num1; i++) {
      if (num1 % i == 0) {
        fac1 = fac1 + 1;
      }
    }
    num2 = num1 - 2;
    for (i = 1; i <= num2; i++) {
      if (num2 % i == 0) {
        fac2 = fac2 + 1;
      }
    }
    num3 = num1 + 2;
    for (i = 1; i <= num3; i++) {
      if (num3 % i == 0) {
        fac3 = fac3 + 1;
      }
    }

    if (fac1 <= 2 && fac2 <= 2) {
      printf("%d and %d are twin prime numbers\n", num1, num2);
    }
    if (fac1 <= 2 && fac3 <= 2) {
      printf("%d and %d are twin prime numbers\n", num1, num3);
    }
  }
  getch();
}

目标是打印双素数,在这种情况下为 100,但当我从 5 开始时,我只能得到这个输出 5和3是孪生素数 5和7是孪生素数

【问题讨论】:

  • 您需要为每次迭代(在外循环内)重置计数器 fac1fac2fac3

标签: c loops for-loop primes


【解决方案1】:

在 num1 循环的每次迭代中,您应该清除 fac1..3。一旦fac1 达到 2,则永远不会再遇到 if 子句。

您的代码也显示出很大的优化空间:所有偶数都不适合命中。如果使用 num1=5 运行代码,则同时测试 num1-2 和 num1+2。稍后使用 num1=7 再次测试 5 - 7 对。

这是我的代码,带有单独的主要测试器:

#include <stdio.h>

bool IsPrime(int num)
{
  int i;
  for (i = 3; i < num; i+=2) 
     if (num % i == 0) return false;
  return true;
}

void main() 
{
   int num;
   clrscr();
   for (num = 3; num < 100; num += 2) 
   {
      if (IsPrime(num) && IsPrime(num+2))
         printf("%d and %d are twin prime numbers\n", num, num+2);
   }
   getch();
}

【讨论】:

    【解决方案2】:

    它只给出两个结果,因为您查找孪生素数的代码不会重复用于其他数字。您将不得不对连续的数字重复该过程。

    #include<stdio.h>
    
    int isPrime(int n);
    
    void main() {
    
      int num;
      clrscr();
        for(num = 5; num < 100; num = num+1)
        {
            if(isPrime(num) && isPrime(num + 2))
            {            
                printf("%d and %d are twin prime numbers\n", num, num+2);
                num= num + 2; 
            }                
        }    
       getch();
    }
    
    int isPrime(int n)
    {
        if(n == 1)
        {
            return 0;
        }
        int i;
        for(i = 2; i < n; i++)
        {
            if(n % i == 0)
            {
                // number is not prime
                return 0;
            }
        }
    
        // number is prime
        return 1;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多