c - C 循环中的孪生素数仅给出第一个值

标签 c loops for-loop primes

这是代码:

#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是孪生素数

最佳答案

在 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();
}

关于c - C 循环中的孪生素数仅给出第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093770/

相关文章:

javascript - 将数组中的值添加到对象 javascript

c - 使用recv从套接字接收数据不起作用

c++ - 数据管理错误 C++

c# - C# for 循环中的两个计数器

java - 绘制图标网格

C - 使用 for 循环将 2 个数组连接成一个

C/C++ 多维数组内部

c - 32位变量的右移操作

c - SPARC LEON 错误 : IU exception (tt = 0x2B, 数据存储错误)

java - 迭代循环至少 1000 次