我要把我的结果报告给你。
输入/输出示例:
输入自然数(非负整数):12
阶乘120152218
超级工厂:168016008
超阶乘:170942852
计算阶乘、超阶乘和超阶乘的代码:
公共类超阶乘{
public static int ultrafactorial(int n) {
if (n == 0 || n == 1) {
return factorial(n);
} else {
return superfactorial(n) * ultrafactorial(n-1);
}
}
public static int superfactorial(int n) {
if (n == 0 || n == 1) {
return factorial(n);
} else {
return factorial(n) * superfactorial(n-1);
}
}
public static int factorial(int n) {
if(n == 0 || n == 1) {
return n;
} else {
return n * factorial(n-1);
}
}
public static void main(String []args){
Scanner console=new Scanner(System.in);
int n=console.nextInt();
System.out.println("factorial of n="+factorial(n));
System.out.println("superfactorial of n="+superfactorial(n));
System.out.println("superfactorial of n="+ultrafactorial(n));
}
}
1条答案
按热度按时间weylhg0b1#
这太天真了。5的超阶乘是:
3175 042373 780336 892901 667920 556557 182493 442088 021222 004926 225128 381629 943118 937129 098831 435345 716937 405655 305190 657814 877412 786176 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000
是的,所有这些数字。想象一下12的超阶乘有多大。如果你现在开始写下来,你将在几十亿年后完成。最好快点拿笔和纸!
int包含一个介于-2147483648和2147483647之间的值。你只是几个数字,短,在那里。
12的超阶乘在天文上是巨大的。它太大了,如果你把计算机上所有的~68719476736位都用做内存(值8gb),它就装不下了。一点也不接近。因此,用一台基本的计算机计算12的超阶乘是不可能的/非常复杂的,并且需要一个相当大的硬盘来存储数字,更不用说计算了。估计要花上数万亿年的时间。宇宙可能没有足够的能量去做。
但这就是为什么这个问题包含了一个小小的警告:答案在10000001素数的modspace之内。这个想法是,假设10000001素数是x。然后数学是这样的:“x-1”是一个数字。如果向其中添加1,则结果应为0。你在这个空间里做的任何计算都不会是x或更大;相反,你的数字线更像是一个圆:它是循环的。
这意味着,假设您可以存储10000001st素数,那么任何计算都不会导致太大而无法存储的数字。
然而,要完成这项工作,你需要在计算机代码中掌握的技巧并不是那么简单。不过,你可以试试这个:
BigInteger
有一个modPow
在这里似乎非常相关的方法:biginteger与int类似,但它们可以容纳任意大小的值(不过,这并不会改变事情的复杂性:尝试计算12^11^10^9^。。。与大整数仍然需要一个宇宙大小的上帝计算机)。关键的是,他们有modpow方法:
就是你要找的。
至于SuperFactory,我认为你只是把乘法当作正常的操作,但是在每个结果之后,对计算进行模化。模具有如下性质(其中
%
是模块运算符,如中所示,a % b
意思是:a除以b。抛弃结果,保留剩余的;11 % 3
是2。模的一个优点是,在大多数操作下,您可以自由地模化所有内容,因为它“向外扩展”。假设操作“x*y”的答案是“z”。模运算有一个有趣的性质:
"(x % c) * (y % c) = (z % c)
同样,对于所有可以想象的价值观c
! 请注意,这个“模展开”的东西是有限制的,但是这个练习的重点大概是你应该弄清楚模背后的数学(或者学习它,有很多关于这个的文档,它在密码学中被大量使用)。无论如何,我认为,对于超级工厂,比如说,5个,要分步骤进行:超级AC(5)=5!*4! * 3! * 2! * 1!
但这很难理解,也不合适,因此,请改为:
m=那个素数。superfacmod(5,m)=(5!%m)(4!%m)(3!%m)(2!%m)(1!%米)
其中**是模乘,并且
5!
当然是1 * 2 * 3 * 4 * 5
,但你也可以这样做1**2**3**4**5
相反。您可以在所有阶段进行模运算,而不会出现问题。我认为如果你这样做,你可以在合理的时间内计算出superfacmod(12,m)。