【问题标题】:Twin primes C code双素数 C 代码
【发布时间】:2017-12-20 21:48:59
【问题描述】:

我正在尝试用 C 语言打印以下系列 4 6 12 18 30 42 60 72....最多 n。它的逻辑很简单;我们必须打印数字,使得前面和后面的数字应该是素数!但是下面的代码在打印后没有循环 4.下面的代码有什么问题?

#include <stdio.h>

int main(){
    int n, i, j, p2, k;
    int count1=0, count2=0;
    printf("enter the number:\n");
    scanf("%d",&n);
    for(i=3;i<n;i++){
        for(j=2;j<i;j++){
            if(i%j==0){
                count1++;
                break;
            }
        }
        p2=i+2;
        for(k=2;k<i;k++){
            if(p2%k==0){
                count2++;
                break;
            }
        }
        if(count1==0 && count2==0){
            printf("%d",i+1);
        }

    }
}

【问题讨论】:

  • 3 和 5 之后的所有素数对(从 5 和 7 开始)对于某个整数 x 采用 6x±1 的形式。你将如何确定素数——你应该有一个函数来做到这一点吗?然后,您可以遍历 6 的倍数并检查 ±1 值的素数,如果两者都是素数则打印。此外,由于值 6x±1 总是奇数,因此您不需要检查是否可以被 2 整除;并且(通过构造)它们也不能被 3 整除。这可以加快素数检查。此外,在第一个内部循环中,您可以使用j * j &lt; i 从根本上减少步骤数。

标签: c loops for-loop primes


【解决方案1】:

您的代码是正确的,只需在 外部 for 循环的末尾将 count1count2 设置为 0 >.

你也可以这样试试。 这段代码是用 Java 编写的。您可以将其转换为 C 。逻辑保持不变。 对于Arraylist,采用固定长度的数组等于n

import java.util.*;
class prime
  {
     public static void main(String[] args){

        int n, i, j, p2, k,o;
        ArrayList<Integer> prime = new ArrayList<Integer>();
        ArrayList<Integer> series = new ArrayList<Integer>();
        int count1=0, count2=0;
       Scanner s = new Scanner(System.in);
       System.out.println("enter the number:\n");
           n=s.nextInt();
       if(n<3)
       {
          System.out.println("prime numbers start from 3");
       } 
       for(i=3;i<=n;i++)
       {
        for(j=2;j<i;j++)
        {
           if(i%j==0)
          {
             count1=1;
             break;
          }

       }
      if(count1==0)
      {
        prime.add(i);
      }
      count1=0;
      }

      for(k=0;k<prime.size()-1;k++)
        {

              int prdsr=prime.get(k);
              int sucsr=prime.get(k+1);
              if((sucsr-prdsr)==2)
              {
                  series.add((prdsr+1));
              }

        } 

        for(o=0;o<series.size();o++)
        {
         System.out.print("  "+series.get(o));
        }
    }
}

【讨论】:

    【解决方案2】:

    您只需在循环结束时将计数器设置为 0

    #include<stdio.h>
    int main(){
    int n, i, j, p2, k;
    int count1=0, count2=0;
    printf("enter the number:\n");
    scanf("%d",&n);
    for(i=3;i<n;i++){
        for(j=2;j<i;j++){
            if(i%j==0){
                count1++;
                break;
            }
        }
        p2=i+2;
        for(k=2;k<i;k++){
            if(p2%k==0){
                count2++;
                break;
            }
        }
        if(count1==0 && count2==0){
             printf("%d ",i+1);
        }
        count1=0; count2=0;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多