【问题标题】:Getting all prime numbers between 2 and 100 in C在C中获取2到100之间的所有素数
【发布时间】:2012-10-05 05:37:24
【问题描述】:

这是我的代码,应该只输出素数。

#include <stdio.h>
int prime(int n){
    int j;
    for (j=2;j<=n/2;j++){
        if((n%j)==0){
            return 0;
        }
        else{
            return 1;
        }
    }
}
void main(){
    int i,p;
    for (i=2;i<=100;i++){
        p=prime(i);
        if(p==1){
            printf("%d \n",i);
        }
    }
}

结果是 2,3,7,9,11,13,15....

不是 2,3,5,7,11,13....

我做错了什么?

【问题讨论】:

  • 我虽然作业标签已被弃用..
  • prime 中的 for 循环如果总是在有机会重复之前返回,它的作用是什么?
  • 另一种没有任何余数的方法是埃拉托色尼的“展开”筛子:stackoverflow.com/questions/5200879/…

标签: c loops primes


【解决方案1】:

你可能想要:

int prime(int n){
    int j;
    for (j=2;j<=n/2;j++)
        if((n%j)==0)
            return 0;
   return 1;
}

【讨论】:

  • 您的代码实际上并没有循环,因为它总是在第一次检查时返回。如果(n%j)不等于0,则不想返回,需要测试其他可能的因素。
【解决方案2】:

质数是只能被两个数整除的数。例如 2,3,5,7,11 等。

int main()
{
    int i,j,n=0;
    for(i=2;i<=100;i++)
    {
        for(j=1;j<=i;j++)
        {
            if(i%j==0)
            {
              n++;
            }
        }
        if(n==2)
        printf("%d\n",i);
        n=0;
    }
    getch();
}

【讨论】:

  • 很奇怪你做了额外的工作让循环检查一个数字是否可以被一个和它自己整除只是为了让额外的工作不得不计算因子的数量。此外,没有名为getch 的C 函数。您的程序是否无偿地特定于平台?为什么还要等待按键被击中?这只会使某人难以将程序的输出重定向到文件。
【解决方案3】:

试试这个:

int prime(int n){
    int j;
    int isPrime = 1;
    for (j=2;j<=n/2;j++){
        if((n%j)==0){
            isPrime = 0;
            break;
        }
    }
    return isPrime;
}

【讨论】:

    【解决方案4】:

    如果您试图找出不超过给定数字(在您的情况下为 2..100)的素数,则构建素数表将加快该过程:

    注意:输入是连续的以帮助构建素数表,这一点很重要。

    #include <stdio.h>
    #include <math.h>
    
    /* Building a prime table for fast look up
     * NOTE : Numbers should be input from 2 to n in a sequential pattern to help build prime table;  */
    
    # define PRIME_TAB_MAX 200
    
    int prime_specific(int num)
    {
        static int primeTab[PRIME_TAB_MAX] = { 0, };
        static int primeCount = 0;
        int check_limit ;
        unsigned int idx;
    
        if (num < 2)
            return 0;
    
        if (primeCount > 0) {
            check_limit = (int)sqrt(num);
            for (idx = 0; idx < primeCount && primeTab[idx] <= check_limit; idx++) {
                if (0 == (num % primeTab[idx])) {
                    return 0;
                }
            }
        }
        else {
            for (idx = 2; idx <= num / 2; idx++)
                if (0 == (num % idx))
                    return 0;
        }
    
        if (primeCount < PRIME_TAB_MAX) {
            primeTab[primeCount++] = num;
            return 1;
        }
        else {
            fprintf(stderr, "\nERROR: Prime Table is full");
            return (-1); //Internal error
        }
    }
    
    int main(void)
    {
        unsigned int idx;
        int status ;
    
        for (idx = 2; idx <= 1000; idx++) {
    
            status = prime_specific(idx);
    
            switch (status)
            {
            case 1:
                fprintf(stderr, "%d\n", idx);
                break;
            case 0:
                //Do nothing
                break;
            default:
                fprintf(stderr, "\nERROR:Internal Error");
                return (-1);
            }
        }
        return 0;
    }
    

    【讨论】:

      【解决方案5】:

      代码:

      #include <stdio.h>
      
      int main ()
      
      {
      
         /* local variable definition */
      
         int i, j;
      
           for(i=2; i<100; i++)
          {
            for(j=2; j <= (i/j); j++)
      
              if(!(i%j)) break; // if factor found, not prime
      
            if(j > (i/j)) printf("%d is prime\n", i);
          }
      
         return 0;
      
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-09
        • 2012-11-09
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 2019-11-16
        • 2015-05-20
        相关资源
        最近更新 更多