gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:50:12 25 4
gpt4 key购买 nike

我正在开发一个在 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);
}

正如您在下面看到的,我成功创建了一个线程,但是缺少一些素数。我相信我可能在我调用的线程函数中的某个地方搞砸了。谢谢!

最佳答案

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

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

另请注意该行

int limit = (int *)primenum;

看起来很奇怪。强制转换应该是 int,而不是 int *

另一点是,正如退休忍者所说,您正在将数字分配给 0 元素数组。在此代码中,除了打印点之外,没有使用 primeNumbers,因此应该像

一样直接进行打印
printf("%d ", ((a / i) * b));

关于c - 为什么我的 pthread 程序缺少素数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com