zoukankan      html  css  js  c++  java
  • 大数的阶乘问题

    直接使用现有的基本数据类型(int,long)等保存大数的阶乘结果显然是不行的,因为不论是int,还是long类型,都只能保存一定的数字范围的数,而阶乘的结果可能非常巨大,基本数据类型显然是无法胜任的。那如何计算较大数字的阶乘呢?可以使用数组来保存阶乘的结果,申请一个较大长度的数组便可实现保存较大数字的阶乘。具体实现代码如下(Java版):

     1 import java.util.Scanner;
     2 /**
     3  * 大数的阶乘
     4  * @author JiaJoa
     5  *
     6  */
     7 public class JieCheng {
     8 
     9     public static void main(String[] args) {
    10         
    11         Scanner in = new Scanner(System.in);
    12         int num = in.nextInt();
    13         int[] arr = new int[num*5];  //申请一个较大数组保存每次相乘的结果
    14         arr[arr.length-1] = 1;  //注意从数组的末尾开始向前端插入数字,并且由于0!=1,1!=1,直接从1开始计算
    15         for(int n=2;n<=num;n++){
    16             arr = multiply(arr,n);
    17         }
    18         
    19         display(arr);  //打印阶乘的结果
    20         
    21         in.close();
    22     }
    23     
    24     //计算两个数字的乘积,其中一个数字较大,使用数组保存,另一个为整形
    25     public static int[] multiply(int[] arr,int n){
    26         for(int i=0;i<arr.length;i++){ //模仿数字乘法的过程,先用数组的各位乘以该整形n
    27             arr[i]*=n;
    28         }
    29         for(int i=arr.length-1;i>0;i--){ //对数组中相乘后的各位进行十进制转换,大于10的进位处理
    30             arr[i-1] += arr[i]/10; //使用相乘计算进位
    31             arr[i] = arr[i]%10; //使用相与计算该位数字
    32         }
    33         return arr;
    34     }
    35     
    36     //打印阶乘的结果
    37     public static void display(int[] arr){
    38         StringBuilder sb = new StringBuilder("");
    39         int flag = 0;
    40         for(int i=flag;i<arr.length;i++){
    41             sb.append(arr[i]);
    42         }
    43         String str = sb.toString().replaceAll("^0*", "").trim(); //剔除结果中前端的0
    44         System.out.println(str);
    45     }
    46 }
  • 相关阅读:
    【数学建模】—优秀论文(一)
    【数学建模】—论文排版
    【Linux学习】—第8章linux编程
    【Linux学习】—文件权限和目录配置
    【ESP8266学习】(一)
    【OpenCV】——b站达尔闻
    【Linux学习】——Shell编程基础
    【数学建模】——模拟退火算法(SAA)
    react 开发中火狐,Safari浏览器嵌套iframe显示空白
    element ui dataPicker 日期范围限制
  • 原文地址:https://www.cnblogs.com/JiaJoa/p/7793128.html
Copyright © 2011-2022 走看看