编辑 - 更改标题以匹配实际的问题陈述。
我正在编写一个函数来计算 100 中的数字之和!但我似乎有两个大问题。
实际结果100!仅精确到前几个数字(实际结果为 933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979 20827223758251185210916864000000000000000000000000)
我将结果数字的数字相加的方法没有输出正确的结果。
这是我当前的代码:
void factorialSum()
{
double fact100 = factorial(100);
double suma = 0;
printf("100! is equal to: %.0f", fact100);
while (fact100 > 0)
{
double temporal = fmod(fact100, 10);
suma = suma + temporal;
fact100 = fact100/10;
}
printf("\nThe sum of all digits in 100! is: %.0f", suma);
}
函数 Factorial() 定义为:
double factorial (double n)
{
double mult = 1;
double i = n;
while (i>=1)
{
mult *= i;
i = i - 1;
}
return mult;
}
该程序输出 9332621544394410218832560610857526724094425485496057150916691040040799506424293714863269403045051289804298929694447489 8258737204311236641477561877016501813248 结果为 100!并表示其数字之和等于 666。
如有任何帮助,我们将不胜感激,谢谢。
In C, a double
通常具有 53 位精度,对应于 16 或 17 位精度。所以一旦你超越了22!
, a double
无法再表示准确的结果,如以下代码所示。请注意,在23!
,尾随零消失,因为double
不再代表精确值。
#include <stdio.h>
#include <stdint.h>
int main( void )
{
double y;
y = 1;
for ( int i = 2; i < 30; i++ )
{
y *= i;
printf( "%2d %32.0lf\n", i, y );
}
}
这是程序的输出
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 39916800
12 479001600
13 6227020800
14 87178291200
15 1307674368000
16 20922789888000
17 355687428096000
18 6402373705728000
19 121645100408832000
20 2432902008176640000
21 51090942171709440000
22 1124000727777607680000
23 25852016738884978212864
24 620448401733239409999872
25 15511210043330986055303168
26 403291461126605650322784256
27 10888869450418351940239884288
28 304888344611713836734530715648
29 8841761993739700772720181510144
如果你想计算精确的值100!
你需要使用数字数组(又名bignums),进行计算。您可以找到一个 bignum 库来使用,或者自己实现 bignum 乘法。维基百科关于 bignums 的文章提供了伪代码用于计算阶乘。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)