开发者社区> 问答> 正文

C循环中的双质数仅给出第一个值

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

展开
收起
kun坤 2019-11-29 11:29:49 522 0
1 条回答
写回答
取消 提交回答
  • 在num1循环的每次迭代中,应清除fac1..3。一旦fac1达到2,if子句将不再满足。

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

    这是我的代码,带有单独的主测试程序:

    #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();
    }
    
    2019-11-29 11:30:02
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载