gpt4 book ai didi

c - 如何计算 C 中的大 nPr?

转载 作者:行者123 更新时间:2023-12-04 12:05:21 24 4
gpt4 key购买 nike

我用 C 写了一个计算两个数的 nPr 的函数,你能帮我修改它以处理大数吗?

我需要能够计算高达 1x10^12 的值 - 我已经尝试了很多不同的数据类型并且非常卡住!

#include<stdio.h>
#include<math.h>

int main()
{
long int n=49,k=6;
printf("%li nPr %li = %li\n\n",n,k,nPr(n,k));

return 0;

}

long nPr(long int n, long int k);
long nPr(long int n, long int k){

if (n < 0 ){
printf("\nERROR - n is less than 0\n\n");
return -1;
}

if (k > n ){
printf("\nERROR - k is greater than n\n\n");
return -1;
}

else {
long int i,result = 1,c=n+1-k;

for(i=c; i<=n; i++)
{
result = result * i;
}
return result;
}
}

谢谢

J

更新:这些是没有重复的排列,

我也试过了

long long nPr(long long int n, long long int k);
long long nPr(long long int n, long long int k){

if (n < 0 ){
printf("\nERROR - n is less than 0\n\n");
return -1;
}

if (k > n ){
printf("\nERROR - k is greater than n\n\n");
return -1;
}

else {
long long int i,result = 1,c=n+1-k;

for(i=c; i<=n; i++)
{
result = result * i;
}
return result;
}
}

不过好像没什么区别

最佳答案

您可能希望使用 bignums 进行计算, 也许使用 GMP图书馆。如果你切换到 C++,你甚至可以使用熟悉的 a+b 符号,使用 the C++ class interface to GMP .如果你留在纯 C 中,你需要小心使用特定的例程,例如mpz_add补充。

顺便说一句,一些语言(例如 Common Lisp )本身支持大数字(无需修改处理普通数字的源代码)。您可能想尝试使用 SBCL (至少在 Linux 上)。

当然,bignum 算术(一个非常复杂的主题)比原生算术慢。

C 本身不支持 Bignums,你需要使用一个库(或者自己实现你的库,这是无意义的:bignums 的好的算法很难理解和实现,所以最好使用现有的库)。

附言。 long long 没什么用,因为它仍然是 64 位。一些 GCC 编译器和目标处理器可能支持 __int128即 128 位整数,但您确实需要大数。

关于c - 如何计算 C 中的大 nPr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12999929/

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