java基础练习 阶乘计算蓝桥杯

试题 基础练习 阶乘计算

资源限制
时间限制: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);
          
		
	}
}

你可能感兴趣的:(蓝桥杯,java)