我正在创建一个程序,它将使用long基本类型找到阶乘,只有在21的阶乘时才能找到它。答案它给了我-4249290049419214848当答案应该是5109094217000000000并且长的最大值是9223372036854775807.我不知道为什么当这个数字小于9223372036854775807时它不会给我5109094217000000000。 这是我的代码
long j = 1;
for(int i = 1; i <= 21; i++){
j *= i;
}
System.out.println(j);
答案 0 :(得分:1)
21!不是5,109,094,217,000,000,000。
大于use app\models\MyRulesModel;
use yii\data\Pagination;
use yii\db\ActiveRecord;
use yii\data\ActiveDataProvider;
use yii\helpers\ArrayHelper;
use yii\base\Model;
class Controller MyruleController extends \yii\web\Controller
{
public function actionMyrules()
{
$model = new MyRulesModel;
$query = MyRulesModel::find()->orderBy("seq_no ASC");
$dataprovider = new ActiveDataProvider(['query'=> $query ,
'pagination'=> ['pagesize'=>20]]);
echo $this->render('/network/myrules',['my_model'=>$dataprovider]);
}
}
,9,223,372,036,854,775,807。因此it overflows。
答案 1 :(得分:0)
这可能有所帮助:
long :长数据类型是64位二进制补码整数。带符号长度的最小值为-2 63 ,最大值为2 63 -1。在Java SE 8及更高版本中,您可以使用long数据类型来表示无符号的64位长,其最小值为0,最大值为2 64 -1。当需要比int提供的值更宽的值时,请使用此数据类型。 Long类还包含compareUnsigned,divideUnsigned等方法,以支持unsigned long的算术运算。
来自:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
答案 2 :(得分:0)
来自http://www.javawithus.com/programs/factorial-using-big-integer
的想法大于或等于21的因子会产生溢出,因此有必要使用其他东西。 Big-Integer是理想的选择。
这或多或少是实施:
0, 1, 2, 3
答案 3 :(得分:0)
长变量溢出.. 21!是51090942171709440000大于Long.MAX_VALUE
long product = 1;
for(int i = 1; i <= 21; i++){
product = product * i;
System.out.println(product);
if(product < 0 ) {
System.out.println("Overflow");
}
}