您的位置:首页 > 编程语言 > Java开发

算法训练 P0505(Java实现)

2019-02-09 17:36 579 查看

终于来了一道一口气合成的题了,开心

**题目描述:**一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5!=12345=120,因此5!最右边的那个非0的数字是2。再如,7!=5040,因此7!最右边的那个非0的数字是4。再如,15!= 1307674368000,因此15!最右边的那个非0的数字是8。请编写一个程序,输入一个整数n(0<n<=100),然后输出n!最右边的那个非0的数字是多少。

**解题思路:**首先拿出演算本,打开计算器。想想我们阶乘最基础的计算方法,在演算本上写出前10的阶乘,
演算式 ----------------- 阶乘结果 --------------- 最右边非0数字
1!=1 -------------------- 1 ---------------------------------- 1
2!=1x2 -------------------2 ----------------------------------- 2
3!=1x2x3 ----------------- 6 ---------------------------------- 6
4!=1x2x3x4 ----------------- 24 -------------------------------- 4
5!=1x2x3x4x5 --------------120 --------------------------------- 2
6!=1x2x3x4x5x6 ------------- 720 --------------------------------- 2
7!=1x2x3x4x5x6x7 -------- 5040 -------------------------------- 4
8!=1x2x3x4x5x6x7x8 -------40320 -------------------------------- 2
9!=1x2x3x4x5x6x7x8x9 -------- 362880 -------------------------- 8
然后我左看右看终于发现了端倪,前一个数的阶乘结果的最右边0数字乘以当前数,再取出其最右边非0数就是我们的答案了。

不信你们验证一下。。。。结果我验证了一下,有bug,比如说25!
24!的最右边非0数为6,而6*25=150,那结果应该是5呀,但是25!的最右边非0数是4,为什么?,原因解释太长了我不想打字了。。。。直接上代码

代码实现:

import java.util.Scanner;

//阶乘问题
public class Main_p0505 {
public static void p0505(int n) {
int temp;
int sum=1;
for(int i=2;i<=n;i++) {
sum=sum*i;
while(sum%10==0) {
sum=sum/10;
}
sum=sum%1000;   //取出后面的3位来相乘
}
System.out.println(sum%10);
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
p0505(n);
}
}

完毕。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: