我正在尝试制作一个寻找下一个质数并将其添加到txt文件列表中的程序。但是这个程序仍然比我在python中做的要慢。我想使其更快。我不知道动态内存可以帮助您而不是不断读取文件。如果是这样,请您帮我正确实施一个。 我在学习时也欢迎任何其他改进
int root = 0, num = 0, p;
FILE *f;
int check_if_prime(){
//calculates root to prevent calculating it at each step
root = sqrt(p);
//starts at the beginning of the file
fseek(f, 0, SEEK_SET);
//checks if p is prime
num = 0;
while (num <= root){
fscanf(f, "%d", &num);
if (p % num == 0) return 0;
}
return 1;
}
int main(){
f = fopen("PATH", "a+");
//prints all the numbers
int last = 0;
while (1){
fscanf(f, "%d", &num);
if (num == last) break;
printf("\n %d", num);
last = num;
}
//asks up to which number the program should calculate the primes
int nmax;
printf("\nnmax: ");
scanf("%d", &nmax);
//checks through the integers for primes and adds the to the file if they are
for(int p = last + 2; p < nmax; p += 2){
if (check_if_prime(p, f)){
fseek(f, 0, SEEK_END);
fprintf(f, "%d\n", p);
}
}
//ends and restarts the program
printf("\nPress 1 and enter\n\n\n");
scanf("%d");
fclose(f);
main();
return 0;
}
答案 0 :(得分:0)
我正在尝试制作一个寻找下一个质数并将其添加到txt文件列表中的程序。
在给定素数输入列表的情况下,您的程序似乎正在尝试查找 all 个素数直至用户输入的最大值。一种相对简单的方法是实现质数筛,例如Sieve of Eratosthenes。如果可以假定输入文件在其覆盖的范围内没有省略任何质数,则可以使用其内容(至少不超过sqrt(nmax)
的内容)来部分或全部初始化筛子。您将需要为筛子本身动态分配内存。
这将比对目标范围内的每个候选者执行独立的素数测试(任何有用的形式)更有效。由于您本质上将自己限制为类型int
所代表的数字,因此,至少对于通用台式机,笔记本电脑或服务器计算机,可用内存量可能不是限制因素。
就I / O而言,您必须读取整个文件一次,并且必须编写找到的每个新素数。没有解决的办法。但是不要做比您需要做的更多的I / O。特别是,您不需要多次读取文件,并且在读取完文件之后,无需在写入之前四处查找。但是,将读数推迟到您输入nmax
并分配筛子数组并将其与筛子实现集成之后才有意义。
请注意,如果您只想查找下一个素数,那么采用另一种方法可能更明智。