如何使用用户定义的函数检查素数?

时间:2015-04-15 11:39:20

标签: c

我知道素数是多少。但我无法使用C解决逻辑问题。我尝试如下:

main()
{
    int a, b, c, n=0, start, end, sum=0;
    printf("Range Start From: ");
    scanf("%d", &start);
    printf("End of Range: ");
    scanf("%d", &end);

    for(a=start;a<=end;a++)
    {
        for(b=2;b<=a/2;b++)
        {
            if(a%b==0)
            {
                c=0;
                break;
            }
        }
        if(c==1)
        {
            sum+=a;
            n++;
        }
    }
    printf("The Sum of Primes is: %d\nTotal primes: %d", sum, n);
    getch();
    return 0;
}

4 个答案:

答案 0 :(得分:4)

提示:在你的内循环中,你有失败案例:

if(a%b==0)
{
    c=0;
    break;
}

然后你检查成功案例:

if(c==1)
{
    sum+=a;
    n++;
}

c何时成为1

答案 1 :(得分:0)

我建议以下代码有一点速度。

if ( !(a&1) && a!=2) { // !(a&1) is true if a is an even number!
    c=0;
} else {
   c=1; //This is the initialization that lacks in your code!
   for(b=3;b<=a/2;b+=2) 
   {
        if(a%b==0)
        {
          c=0;
         break;
        }
   }
}

此代码并不认为1是您的代码中的素数!

答案 2 :(得分:0)

 //Here is a sample:


 main()
 {
int a, b, c=1, n=0, start, end, sum=0;

printf("Range Start From: ");

scanf("%d", &start);
printf("End of Range: ");
scanf("%d", &end);
for(a=start;a<=end;a++)
 {
    for(b=2;b<=a/2;b++)
    {
        if(a%b==0)
    {
     c=0;
    break;
    }
   if(c==1) printf("%d  ", a);
   c=1;
  }

答案 3 :(得分:-1)

我编写的代码基于这样一个事实,即素数总是由函数p = k * 6-1或p = k * 6 + 1中的一个表示,但不是这两个函数的所有结果是素数。此代码还具有使用素数表的功能。 (要使用该表,您必须使用选项-DUSE_A_TABLE编译此代码,并且必须编写代码以对其进行初始化)。

我认为您可以轻松使用函数isPrime,如果激活质数表,isPrime函数的结果会更快。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>

#ifdef USE_A_TABLE
uint64_t *primi=NULL;
uint64_t inTable=0;
#endif

int isPrime(uint64_t n);

int isPrime(uint64_t n)
{
    uint64_t m,k,i;

    if (!n)
        return 0;

    if (n<4 || n==5)
        return 1;

    if (!(n&1))
        return 0;

    if (!(n%3))
        return 0;

    k=(n-1)/6;m=(n+1)/6;
    if (k*6+1 != n && m*6-1 != n)
        return 0;

    m=sqrt(n)+1;
#ifdef USE_A_TABLE
    k=5;
    for (i=3;i<inTable && primi[i]<=m;i++) {
        k=primi[i];
        if (!(n%k))
            return 0;
    }
    k+=2;

    k=(k-1)/6;
#else
    k=1;
#endif

    m=(m+1)/6;
    for (i=k; i<=m; i++) {
        if ( !(n%(6*i-1)) || !(n%(6*i+1)) )
            return 0;
    }

    return 1;
}

int main(void)
{
    uint64_t from=1;
    uint64_t to=10000;
    uint64_t n;

    for(n=from;n<=to;n++) {
        if (isPrime(n))
            printf("%5lu",n);
    }
    puts("");

    from=400000000;
    to=400002000;

    for(n=from;n<=to;n++) {
        if (isPrime(n))
            printf("%10lu",n);
    }
    puts("");

    return 0;
}