#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 * не может делить * n *. –
@ Jean-BaptisteYunès да, но 'i' - это не число тестируемых. Это количество общего количества простых чисел, найденных до сих пор.Другими словами, довольно бессмысленное число. –
Извините за ошибку. –