我正在开发一个利用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);
}
如下所示,我成功创建了一个线程,但缺少一些素数。我相信我可能在我调用的线程函数中搞砸了。谢谢!
答案 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));