• 大数的阶乘问题


    直接使用现有的基本数据类型(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 }
  • 相关阅读:
    node 命令
    nodejs项目搭建
    linux 安装与配置
    GestureDetector
    activity切换效果
    hadoop
    phonegap 自定义插件
    自定义控件-属性自定义
    zxing demo
    select 语句的执行顺序
  • 原文地址:https://www.cnblogs.com/JiaJoa/p/7793128.html
Copyright © 2020-2023  润新知