Java实现 : 超大整数的阶乘,用时1s

这段代码的思想主要是:
首先将输入的数(m)按字符拆分放到数组中,并对数组进行反转排序使得数位较高的数排在下标较大的空间里,然后进行分别计算该数组中每一个元素与m-1的乘积并将结果一一保存在一个新数组中,然后将该数组传到进位算法中进行进位排列计算,进位算法又将结果返回给原方法,重新开始新一轮的乘积计算,最终得出结果.
例如:
输入的数:n=10;
排序
int a[] = {1,0}=>b={0,1};
进位
b
>{0x9,1x9}=>{0,9}
a = {0,9}
=>{0x8,9x8}
===>{0,72};
======>{0,2,7}…
进位

上代码:

package com.test;

import java.awt.image.ConvolveOp;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

public class Test {
	public char[] getNum() {
		System.out.println("请输入一个大于1的数");
		Scanner i = new Scanner(System.in);
		Integer n = i.nextInt();
		if(n<=1) {
			System.out.println("您输入的数太小");
			return null;
		}
		char arr1[] = new char[n.toString().length()];
		for(int j =arr1.length-1;j>=0;j--) {
			arr1[j] = n.toString().charAt(j);
		}
		char temp[] = new char[arr1.length];;
		for(int x=0;x<arr1.length;x++){
		     temp[x] = arr1[arr1.length-x-1];
	    }

		for(int m = n;m>0;m--) {
			int len = temp.length;
			int temp1[] = new int[len];
			for(Integer x = 0;x<len;x++) {
				if(m==1) {
					return temp;
				}
				temp1[x] = (temp[x]-'0')*(m-1);
		}
//			for (int q = 0; q< temp1.length / 2; q++) {
//	            //进行数组互换
//	            int sum = temp1[q];
//	            temp1[q] = temp1[temp1.length - 1 - q];
//	            temp1[temp1.length - 1 - q] = sum;
//	        }
//			int arr1[] = temp1;;
//			if() {
//				for(int x=0;x<temp1.length;x++){
//					arr1[x] = temp1[temp1.length-x-1];
//		     	}
//			}
			char tempx[] = this.getjin(temp1);
			temp = tempx;
		}
		return temp;
	}
	
	public char[] getjin(int temp[]) {
		int index = temp.length-1;
		for(int i=0;i<=index;i++) {
			if(temp[i]/10>=1) {
				if(i==index) {
			    	int next = temp[i]/10;
			    	int newtemp[] = new int[i+2];
			    	newtemp[i] = temp[i]%10;
			    	newtemp[i+1] = temp[i]/10;
			    	System.arraycopy(temp, 0, newtemp, 0, i);
			    	temp = new int[newtemp.length];
			    	temp = newtemp;
			    	index++;
				}else{
					temp[i+1] = temp[i]/10+temp[i+1];
					temp[i] = temp[i]%10;
			   }
			}else {
				temp[i]=temp[i];
				
			}
//			if(temp[temp.length]>=10) {
//				getjin(temp);		
//			}
		}
		char arr1[] = new char[temp.length];
		for(int z = temp.length-1; z>=0;z--) {
			arr1[z] = Character.forDigit(temp[z],10);
		}
		
		return arr1;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("-----开始计算-----");
	    long startTime = System.currentTimeMillis();
	    Test test = new Test();
		char arr[] = test.getNum();
		System.out.println("阶乘的结果为:");
		for(int i = arr.length-1;i>=0;i--) {
			System.out.print(arr[i]);
		}
		System.out.println("\n");
		System.out.println("结果的总长度为:"+arr.length);
		long endTime = System.currentTimeMillis();
		System.out.println("所用时间:"+(endTime-startTime)/1000+"s");
		System.out.println("-----结束-----");
	}
	
}

运行结果:
在这里插入图片描述

喜欢的点个关注吧O(∩_∩)O

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前后端杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值