为什么我的pthread程序缺少素数?

时间:2018-03-04 22:45:53

标签: c pthreads

我正在开发一个利用C中的pthread的程序。线程的功能是根据用户在CLI输入的最大数量计算素数。例如,用户输入./ComputePrimes 20,输出应为2, 3, 5, 7, 11, 13, 17, 19

但是,出于某种原因,我的程序只输出2到13(因此我的输出为2, 3, 5, 7, 11, 13)。

我正在使用基于威尔逊定理的公式计算素数: https://en.wikipedia.org/wiki/Formula_for_primes

我从过去的一个离散数学课程中了解到,没有可靠的计算素数公式。然而,这个程序的目的是展示我相信我已成功完成的pthreads。这是我的计划:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>


void *generatePrimeNumbers(void *primenum) {
    int  i, j, a, b;
    int primeNumbers[] = {};
    int limit = (int *)primenum;

    for (i = 1; i <= limit; i++) {
           j = 0;
           int a = (factorial(i) % (i + 1));
           int b =  (i - 1) + 2;
           if (((a / i) * b) != 0) {
               primeNumbers[j] = ((a / i) * b);
               printf("%d ", primeNumbers[j]);
               j++;
           }
    }
    printf("\n");
    return NULL;
}

int factorial(int n) {
    if (n == 1) {
        return 1;
    } else return n * factorial(n - 1);

}


int main(int argc, char *argv[]) {
    int numLimit;
    pthread_t primethread;
    if (argc != 2) {
       printf("You need to enter a valid number!\n");
       exit(-1);
   }
   else {
       int i = 0;
       numLimit = atoi(argv[1]);
       if (numLimit < 2) {
               printf("Please enter a number greater than or equal to 2.\n");
               exit(-1);
       }
   }

     pthread_create(&primethread, NULL, generatePrimeNumbers, (void *)numLimit);
     pthread_exit(NULL);
}

如下所示,我成功创建了一个线程,但缺少一些素数。我相信我可能在我调用的线程函数中搞砸了。谢谢!

1 个答案:

答案 0 :(得分:1)

在许多环境中,int只能在20! = 2432902008176640000时存储最多2147483647(2 ** 31 - 1)的整数。因此,factorial(20)无法正确计算。

factorial的返回类型设置为long long将使输入20的输出正确(假设long long可以节省2 ** 63 - 1),但是对于更大的数字,你应该考虑其他方法,比如在数字变得太大之前在factorial方法中取模。

还要注意该行

int limit = (int *)primenum;

看起来很奇怪。演员表应该是int,而不是int *

另一点是你正在为0元素阵列分配数字,正如Retired Ninja所说。 在此代码中,除了打印点之外不使用primeNumbers,因此打印应该直接进行,如

printf("%d ", ((a / i) * b));