Java 我的代码显示的阶乘输出错误 class测试类{ 公共静态void main(字符串args[])引发异常{ 长n=1; 长ans=1; 扫描仪s=新的扫描仪(System.in); 长N=s.nextInt(); 长M=100000007; 对于(inti=1;i
它基本上取决于进行模块化操作时使用的数字M。尝试增加M,如long M=1000000000007l,将生成更有效的阶乘。您的Java 我的代码显示的阶乘输出错误 class测试类{ 公共静态void main(字符串args[])引发异常{ 长n=1; 长ans=1; 扫描仪s=新的扫描仪(System.in); 长N=s.nextInt(); 长M=100000007; 对于(inti=1;i,java,Java,它基本上取决于进行模块化操作时使用的数字M。尝试增加M,如long M=1000000000007l,将生成更有效的阶乘。您的long M=100000007;有问题。(对于较窄的类型,这是否是对旧的C方法的一种倒退?)实际上,100000007的倍数将被减去,以将大于或等于该值的数字拉回到范围内:其结果将是无意义的 不要那样做。依靠Java作为最后手段为您提供帮助 然后只需采用long类型的规则之一:因为long的范围在Java中是固定的,所以您可以使用该类型计算的最大阶乘数也是固定的,正好是
long M=100000007;
有问题。(对于较窄的类型,这是否是对旧的C方法的一种倒退?)实际上,100000007
的倍数将被减去,以将大于或等于该值的数字拉回到范围内:其结果将是无意义的
不要那样做。依靠Java作为最后手段为您提供帮助
然后只需采用long
类型的规则之一:因为long
的范围在Java中是固定的,所以您可以使用该类型计算的最大阶乘数也是固定的,正好是20!
:
class TestClass {
public static void main(String args[] ) throws Exception {
long n = 1;
long ans = 1;
Scanner s = new Scanner(System.in);
long N = s.nextInt();
long M = 1000000007;
for (int i=1; i<=N; i++) {
ans = (ans*i) % M;
}
System.out.println(ans);
}
}
执行此操作并完全删除
M
。显示输入、输出和预期输出。顺便说一句:阅读Java Naminc约定。变量名称应以小写字母开头为什么有%M
(实际上为什么有M
)?@ElliottFrisch某种形式的溢出保护尝试@Elliott FrischLike什么输入输出错误?事实上,12!是适合此过滤器的最后一个值。12!:479001600&13!:6227020800
。当然,对于N>=20
if (N > 20){
/*an overflow will occur so inform the user of your program*/
}