我知道素数是多少。但我无法使用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;
}
答案 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;
}