for(t=2;t<=sqrt(i);t++)
你用t<i-1的话,无效的循环太多了
比如判断100是否为素数的话,实际你判断从2到10就可以了,但你从2判断到99
让n自增到sqrt(n)就行
用筛选法:
#include<stdio.h>
int num[1000002] = { 1,1,0 };
void Init()
{
int i, j;
for (i = 2; i <= 500000; i++) {
if (num[i] == 0) {
for (j = i + i; j <= 1000000; j += i) {
num[j] = 1;
}
}
}
}
int sum(int a,int b)
{
int i, sum;
for (i = a, sum = 0; i <= b; i++) {
if (num[i] == 0) {
sum++;
}
}
return sum;
}
int main() {
int n;
Init();
scanf("%d", &n);
if (n == 1)
printf("0\n");
else
printf("%d\n", sum(1,n));
return 0;
}
看看我这个看合适不? 仅供参考!谢谢!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void isprime(int n)
{
if (n < 2)
{
printf("不存在\n");
return;
}
else if (n == 2)
{
printf("2\n");
return;
}
printf("2\n");
int m = n / 2;
int *p = malloc(m * sizeof(int));
int *p0 = p, *p1 = p, *p2 = p;
if (!p)
return;
int i = 3;
int total = 0;
for (; i <= n; i += 2)
{
*p++ = i;
total++;
}
// 有效位置末尾用1标记
*p = 1;
total--;
i = 1;
// 不是素数的位置赋值为4
while (*p1 != 1)
{
if ((p1 - p2 + (i * (*p1))) <= total)
{
*(p1 + (i * (*p1))) = 4;
i++;
}
else
{
p1++;
while (*p1 == 4)
{
p1++;
}
i = 1;
}
}
while (*p0 != 1)
{
if (*p0 != 4)
{
printf("%d\n", *p0);
}
p0++;
}
free(p2);
}
int main()
{
int n;
scanf("%d", &n);
isprime(n);
return 0;
}
#include<stdio.h>
int prime(int x)
{
for(int j=2;j<=x/j;j++)
{
if(x%j==0)
{
return 0;
}
}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
if(prime(i))
{
printf("%d ",i);
}
}
return 0;
}