两个任意阶阶乘数比较大小

该博客探讨如何比较两个含有任意阶数阶乘的数的大小。首先对输入进行归一化,去掉相同阶数,然后比较剩余部分。接着,分别处理含阶乘的数(complexNum)和无阶乘的数(simpleNum),通过循环判断和阶乘运算,直至比较到不含阶乘的数。文章提到当前解决方案存在递归导致的栈溢出和长整型数值限制的问题,需要改进阶乘计算方法并考虑精度问题。

描述:n!表示n的阶乘, n!!表示(n!)!,现在需要写一个方法比较两个任意阶数的数的大小,输入以字符串形式给出,例如:比较 6!!!! 和 48!!

算法描述:

1.先对输入进行归一化,即同时除掉相同的阶数,比较剩余部分的大小,比如:先将以上参数化简为: 6! !和48 比较大小;

2.设化简后无阶乘符的数为simpleNum, 上例中simpleNum=48;含阶乘的数为 complexNum=6!!;

3. 取complexNum 中数字部分,与simpleNum 比较大小,如果前者大,直接返回,否则求一次阶乘,再与后者比较; 比较6 与48 大小

4. 如果在上述循环中出现simpleNum比后者小了,而后者还有阶乘符号,那simpleNum就小;直至比较两个不含阶乘数的大小为止; 比较6!=360与48 大小, 返回commlexNum大;

再例:6!!! 与 3!!!! ,先化简为: 6 与3!; 6<3 ;6=(3!=6) && 比较数中已不含! 返回:num1<num2

未解决问题: 目前以递归求解阶乘,当需要进行比较复杂的阶乘预算时,会出现stack overflow error, 正待改进阶乘算法; long型数字 也不够大数运算;

如果用log求阶乘的话,精确性又收到影响:

public static int factory2(int num){// 阶乘求解公式2
		if(num==1){
			return 1;
		}
		else{
			double result=0;
			for(int i=1;i<=num;i++){
				result+=Math.log(i);
			}
			return (int)Math.exp(result);
		}
	}

这样运行factory2(4)得到结果为23 ,行不通。下面是代码:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值