【发布时间】:2016-02-15 02:28:28
【问题描述】:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int anz;
scanf("%d", &anz);
time_t start = time(0);
int *primZ = malloc(anz * sizeof(int));
primZ[0] = 2;
int Num = 0;
for (int i = 1, num = 3; i < anz; num += 2) {
for (int j = 1; j < i; j++) {
if (num % primZ[j] == 0) {
num += 2;
j = 0;
}
//this part
if (primZ[j] > i / 2)
break;
}
primZ[i] = num;
i++;
printf("%d ,",num);
}
time_t delta = time(0) - start;
printf("%d", delta);
getchar();
getchar();
return 0;
}
代码运行良好,问题是为什么。 if(primZ[j] > i/2) 部分使程序快 2 - 3 倍。它实际上应该是if(primZ[j] > num/3),这很有意义,因为num 只能是奇数。但它是找到的素数的数量。对我来说完全是无稽之谈。请解释一下。
【问题讨论】:
-
对于任意数n,如果m大于n/2,显然m i> 不能除 n.
-
@Jean-BaptisteYunès 是的,但
i不是正在测试的号码。它是迄今为止发现的素数总数的计数。换句话说,一个相当没有意义的数字。 -
对错误感到抱歉。
-
这个分支从来没有被使用过(只在开始时的琐碎案例),它看起来像是一些旧的优化尝试的剩余部分......
-
这段代码也是错误的......它产生非素数。