F#大整数阶乘

简介: 在数学上,有时候需要计算阶乘,即n! = 1 * 2 * 3 * ... (n - 1) * n ,由于int类型的长度限制,当n比较大的时候,则n!可能就无法得出正确的计算结果。此时就需要用到大整数类型bigint。

     在数学上,有时候需要计算阶乘,即n! = 1 * 2 * 3 * ... (n - 1) * n ,由于int类型的长度限制,当n比较大的时候,则n!可能就无法得出正确的计算结果。此时就需要用到大整数类型bigint。

    下面介绍一下如何用F#语言实现一个计算阶乘的函数,首先用int类型来进行定义,看看会发生什么,代码如下:

letrecfactn=matchnwith|iwheni<0->0|0|1->1|_->n*fact(n-1) 
  ;;

在命令行输入 dotnet fsi进入F#交互界面,并首先执行fact函数定义,然后依次进行测试:

1628574321590046518.jpg

当 n = 3时,则 计算结果为 6 ,可当n=20时,计算结果应该为2432902008176640000,但是输出结果却为负数,说明已经超出int长度了,无法正确给出计算结果。下面用大整数bigint来解决这个问题。将上述代码修改如下:

letrecbfact (n) : bigint=matchnwith|iwheni<0->bigint.Zero|0|1->bigint(1)
|_-> (bfact(n-1) *bigint(n)) 
        ;;

其中的rec代表函数是一个递归函数,bigint类型代表大整数类型,match with进行模式匹配,when后面可以根据条件来进行匹配,其中的bigint(n)可以将普通的数值n转换成bigint类型。执行此示例,截图如下:

1628574321590046518.jpg

相关文章
|
6月前
|
存储 C++
两数相加(C++)
两数相加(C++)
41 0
|
5月前
2.两数相加
2.两数相加
|
存储
A除于B(大数相除)
A除于B(大数相除)
69 0
|
C++
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
115 0
|
存储 Rust 算法
两数相加
两数相加
146 0
两数相加
两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
98 0
2_两数相加
2_两数相加
100 0
|
测试技术