试题 算法训练 阶乘
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 1*2*3*4*5 = 120,因此5!最右边的那个非0的数字是2。再如:7! = 5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 最右边的那个非0的数字是多少。
输入格式:输入只有一个整数n。
输出格式:输出只有一个整数,即n! 最右边的那个非0的数字。
输入输出样例
样例输入
6
样例输出
2
分析:
题目的要求是计算计算阶乘的结果从右到左数不是0的数,直接输出就可以了,但是大家都应该知道阶乘值太大了,int、long根本就存储不下,这是我们就应该想到一个对象BigInteger来完成阶乘的计算,计算完毕后赋给一个字符串,通过for循环倒叙遍历然后找到第一个不为0的值并输出即可。会使用到BigInteger的multiply()方法对数值进行乘法。然后转换为String字符串,for遍历charAt()进行对字符串取出在if进行判断是否为0,是则break跳出循环。
看代码详细解释:
试题 算法训练 阶乘
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 1*2*3*4*5 = 120,因此5!最右边的那个非0的数字是2。再如:7! = 5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 最右边的那个非0的数字是多少。
输入格式:输入只有一个整数n。
输出格式:输出只有一个整数,即n! 最右边的那个非0的数字。
输入输出样例
样例输入
6
样例输出
2
分析:
题目的要求是计算计算阶乘的结果从右到左数不是0的数,直接输出就可以了,但是大家都应该知道阶乘值太大了,int、long根本就存储不下,这是我们就应该想到一个对象BigInteger来完成阶乘的计算,计算完毕后赋给一个字符串,通过for循环倒叙遍历然后找到第一个不为0的值并输出即可。会使用到BigInteger的multiply()方法对数值进行乘法。然后转换为String字符串,for遍历charAt()进行对字符串取出在if进行判断是否为0,是则break跳出循环。
看代码详细解释:
import java.util.Iterator; import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); char arr[][]=new char[2*n-1][2*n-1]; //arr[n-1][n-1];为中心 for (int i = 0; i < 2*n-1; i++) { for (int j = 0; j < 2*n-1; j++) { arr[i][j]='.'; } } char c=(char) (64+n); arr[n-1][n-1]=c; //西北 for (int i = n-2; i>-1; i--) { arr[i][i]=(char) (arr[i+1][i+1]-1); } //东南 for (int i = n; i<2*n-1; i++) { arr[i][i]=(char) (arr[i-1][i-1]-1); } //东北 int u=n; for (int i = n-2; i>=0; i--) { arr[i][u]=(char) (arr[i+1][u-1]-1); u++; } //西南 int k=n-2; for (int i = n;i<2*n-1; i++) { arr[i][k]=(char) (arr[i-1][k+1]-1); k--; } //正北 for (int i = n-2; i >-1; i--) { arr[i][n-1]=(char) (arr[i+1][n-1]-1); } //正南 for (int i = n; i<2*n-1; i++) { arr[i][n-1]=(char) (arr[i-1][n-1]-1); } //正东 for (int i = n; i <2*n-1; i++) { arr[n-1][i]=(char) (arr[n-1][i-1]-1); } //正西 for (int i = n-2; i>=0; i--) { arr[n-1][i]=(char) (arr[n-1][i+1]-1); } for (int i = 0; i < 2*n-1; i++) { for (int j = 0; j <2*n-1 ; j++) { if(arr[i][j]!=' ') System.out.print(arr[i][j]); } System.out.println(); } } }