试题 基础练习 阶乘计算
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
输入一个正整数n,输出n!的值。
其中n!=123*…*n。
算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
输入包含一个正整数n,n<=1000。
输出格式
输出n!的准确值。
样例输入
10
样例输出
3628800
//解题思路:理解题中“而计算机能表示的整数范围有限”表示数据大的没有数据类型来接收,因此可以考虑用字符串接收。再运用题中“使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。”计算
package Main;
import java.awt.List;
import java.util.Scanner;
public class Main {
//用于初次接收相乘数字的分开数组;
static int[] arr;
//ssv是对初次接收相乘数字的分开数组的arr数组,进行每个下标数字大于10玩前面数组进十位数百位后的数组
//(列arr[0]=6,arr[1]=15,则ssv数组长度+1并ssv[0]=6,ssv[1]=5,ssv[3]=1);
static int[] ssv;
//接收最后ssv数组进行拼接的字符;
static String stt="";
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
//为arr,和ssv数组建立初始值
arr=new int[1];
arr[0]=n;
ssv=new int[1];
ssv[0]=n;
Shu( n, arr);
System.out.print(stt);
}
public static void Shu(int n,int[] arr) {
//当从n*n-1*n-2*...*1;
if (n==1) {
for (int i = 0; i < ssv.length; i++) {
stt=ssv[i]+stt;
}
return;
}
//用于接收arr小标成此数大于十的数;
int v=0;
for (int i = 0; i < arr.length; i++) {
arr[i]=ssv[i]*(n-1)+v;
//arr最后一个时根据这个数的大小来判断数组需要增加的长度
if(i==arr.length-1) {
String sen=arr[i]+"";
//l接收arr最后一个数的长度
int l=sen.length();
//重置ssv数组,重新设计长度和接收数据;
ssv=new int[l+i];
for (int j = 0; j < arr.length; j++) {
ssv[j]=arr[j];
}
//接收增长的数据;
for (int j = 0; j <l ; j++) {
ssv[i+j]=sen.charAt(l-1-j)-48;
}
continue;
}
//对大于10的arr小标数进行递进(列arr[0]=11,则arr[0]=1,v=1)
if(arr[i]>=10) {
v=arr[i]/10;
arr[i]=arr[i]%10;
}
else {
v=0;
}
}
arr=new int[ssv.length];
Shu(n-1, arr);
}
}