总理发电机太慢

时间:2019-06-14 13:16:25

标签: c

我正在尝试制作一个寻找下一个质数并将其添加到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;
}

1 个答案:

答案 0 :(得分:0)

  

我正在尝试制作一个寻找下一个质数并将其添加到txt文件列表中的程序。

在给定素数输入列表的情况下,您的程序似乎正在尝试查找 all 个素数直至用户输入的最大值。一种相对简单的方法是实现质数筛,例如Sieve of Eratosthenes。如果可以假定输入文件在其覆盖的范围内没有省略任何质数,则可以使用其内容(至少不超过sqrt(nmax)的内容)来部分或全部初始化筛子。您将需要为筛子本身动态分配内存。

这将比对目标范围内的每个候选者执行独立的素数测试(任何有用的形式)更有效。由于您本质上将自己限制为类型int所代表的数字,因此,至少对于通用台式机,笔记本电脑或服务器计算机,可用内存量可能不是限制因素。

就I / O而言,您必须读取整个文件一次,并且必须编写找到的每个新素数。没有解决的办法。但是不要做比您需要做的更多的I / O。特别是,您不需要多次读取文件,并且在读取完文件之后,无需在写入之前四处查找。但是,将读数推迟到您输入nmax并分配筛子数组并将其与筛子实现集成之后才有意义。

请注意,如果您只想查找下一个素数,那么采用另一种方法可能更明智。