C/找到190!c编程中的(阶乘)
我试着找到C/找到190!c编程中的(阶乘),c,fact,C,Fact,我试着找到190在C中 我将变量定义为long double,但我发现它(正确地)只计算到172!: 在那之后,我得到了#INF00000…` 有办法吗?一种方法是使用任意精度的算法。您可以自己实现,也可以使用其中之一 请注意,即使值为172!您得到的结果很可能只是大致正确。190的阶乘是: 9680322267525524915612346514615331205418161260462873360750859944104623425228207640470674933540169424682
190代码>在C
中
我将变量定义为long double,但我发现它(正确地)只计算到172!:
在那之后,我得到了#INF00000
…`
有办法吗?一种方法是使用任意精度的算法。您可以自己实现,也可以使用其中之一
请注意,即使值为172!您得到的结果很可能只是大致正确。190的阶乘是:
96803222675255249156123465146153312054181612604628733607508599441046234252282076404706749335401694246823605259919829615696983449594045555370452536602287443198327465657055663387300134094795955322962027305744027298317935914105128942634895876382260841068184328004851745648000000000000000000000000000000000000000000000
或者,1170位。所以这不适合任何内置类型。您确实需要一个bigint库来表示这么大的内容。此示例(Win32/Visual Studio Express)程序显示错误会变成一个错误!23具有无符号64位:
#include <stdlib.h>
#include <stdio.h>
unsigned __int64 fact( unsigned __int64 in) {
if( in == 1 ) {
return 1;
}
unsigned __int64 f = fact(in-1);
printf( "!%3I64u = %20I64u = 0x%016I64X\n", in-1, f, f );
return in*f;
}
int main( int argc, char * argv[] ) {
unsigned __int64 in = atoi(argv[1]);
unsigned __int64 f = fact(in);
printf( "!%3I64u = %20I64u = 0x%016I64X\n", in, f, f );
return 0;
}
!!21和之后的函数都是错误的。实际上只需要几行代码就可以实现足够多的bigint实现来计算阶乘。下面是打印前200个阶乘的代码
#include <stdio.h>
int mult(int n, size_t size, unsigned char *data) {
int carry = 0;
for (int i = 0; i < size; i++) {
int result = data[i] * n + carry;
data[i] = result % 100;
carry = (result - data[i]) / 100;
}
return carry != 0;
}
void print(size_t size, unsigned char *data) {
int first = 1;
for (int i = 0; i < size; i++) {
int d = data[size - i - 1];
if (first && d == 0) continue;
printf("%0*d", first && d < 10 ? 1 : 2, d);
first = 0;
}
}
int main(int argc, char*argv[]) {
for (int fact = 1; fact <= 200; fact++) {
unsigned char data[1000] = {1};
for (int i = 1; i <= fact; i++) {
if (mult(i, sizeof(data), data)) {
return 1;
}
}
printf("%d! = ", fact);
print(sizeof(data), data);
printf("\n");
}
return 0;
}
#包括
int mult(int n,size\u t size,无符号字符*数据){
整数进位=0;
对于(int i=0;i 对于(int fact=1;事实上您需要使用一个bigint库。请尝试以下操作:的可能重复项
#include <stdio.h>
int mult(int n, size_t size, unsigned char *data) {
int carry = 0;
for (int i = 0; i < size; i++) {
int result = data[i] * n + carry;
data[i] = result % 100;
carry = (result - data[i]) / 100;
}
return carry != 0;
}
void print(size_t size, unsigned char *data) {
int first = 1;
for (int i = 0; i < size; i++) {
int d = data[size - i - 1];
if (first && d == 0) continue;
printf("%0*d", first && d < 10 ? 1 : 2, d);
first = 0;
}
}
int main(int argc, char*argv[]) {
for (int fact = 1; fact <= 200; fact++) {
unsigned char data[1000] = {1};
for (int i = 1; i <= fact; i++) {
if (mult(i, sizeof(data), data)) {
return 1;
}
}
printf("%d! = ", fact);
print(sizeof(data), data);
printf("\n");
}
return 0;
}