蓝桥杯备战刷题Day01- 2019/1/15

1.

问题描述

输入一个正整数n,输出n!的值。

其中n!=1*2*3*…*n

算法描述

n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数aA[0]表示a的个位,A[1]表示a的十位,依次类推。

a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。

首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式

输入包含一个正整数nn<=1000。

输出格式

输出n!的准确值。

样例输入

10

样例输出

3628800

这个题目的思路其实在题目中已经告诉你了,用数组来存放目标数的每个“位”从下标0开始0存放的是这个数的各位然后下标1是十位一次类推,然后开始阶乘了满10就向前进一个位,数组中的每一个数都要和“i”也就是那个阶乘的数相乘从个位开始乘然后得到的结果就是sum然后sum对10取余得到的就是当前这个位的数字如阶乘数是4时sum=12了取余得到2就是结果的个位然后sum再除10得到的就是要向前进的位数下面是这个程序的代码。

public static void main(String[] args) {

     Scanner scan = new Scanner(System.in);

     int num=scan.nextInt();

     int[] arr = new int[5000];   // 这里我们用一个很大的数组保险事实上最后的数也差不多大

     if(num==1 || num==0) {

         System.out.println(1);

     }else {

     numChange(arr,num);

}

     scan.close();

}

public static void numChange(int[] arr, int num) {

     int p=0, sum=0, temp=0;

     arr[0]=1;

     for(int i=1;i<=num;i++) {

         for(int j=0;j<=5000;j++) {       // 这里就是整个代码的核心了这里的j实际上就是数组的下标

             sum=arr[j]*i+temp;          

             arr[j]=sum%10;     

             temp=sum/10;

}

}

     for(int j=5000;j>=0;j--) {

             if(arr[j]!=0) {         // 从数组的后往前找非0的数也就是目标数中最高位的那个数的下标

             p=j;

             break;

}

}

     while(p>=0) {

            System.out.print(arr[p--]);   // 输出

}

}

你可能感兴趣的:(蓝桥杯备战刷题Day01- 2019/1/15)