首页 > 试题广场 >

阶乘末尾非零数字

[编程题]阶乘末尾非零数字
  • 热度指数:10138 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个正整数 n,记其阶乘为:


n! = 1 \times 2 \times 3 \times \dots \times n


\hspace{15pt}请你输出 n! 的十进制表示中,从右往左数第一个非零数字的数值。

输入描述:
\hspace{15pt}在一行上输入一个整数 n\left(1 \leqq n \leqq 10^7\right)


输出描述:
\hspace{15pt}输出一个整数,代表 n! 末尾第一个非零数字。
示例1

输入

6

输出

2

说明

n=6 时,6! = 720,末尾第一个非零数字为 2
示例2

输入

10

输出

8

说明

n=10 时,10! = 3\,628\,800,末尾第一个非零数字为 8
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

int n = in.nextInt();

int result = findLastNoneZero(n);

System.out.println(result);

}

public static int findLastNoneZero(int num) {
long result = 1;
for (int i = 2; i <= num; i++) {
result *= i;

while (result % 10 == 0) {
result /= 10;
}
result %= 1000000000;
}

return (int)(result % 10);
}
}
发表于 2026-02-28 16:20:21 回复(0)
import java.util.Scanner;

public class Main {
//5000的阶乘,连long也顶不住
//求阶乘的最后一位非0数,“只要每次保留最后两个非零数去*下一个数,就行”。这个规律,可以先写一个计算阶乘的,去观察规律。规律是不需要解释的。硬要说的话,你想看脚趾,就和头发无关,关注点可以帮助你快,还剩空间
//所以用到了取余
public static int find(int num) {
int lst_val=1;
for(int i=1;i<=num;i++) {
int tmp=lst_val*i;
if(tmp%10==0)
while(tmp%10 == 0)
tmp=tmp/10;
lst_val=tmp%10;//保留最后两个非0数。连long整型都不用
tmp/=10;
lst_val=lst_val+tmp%10*10;
}
return  lst_val%10;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
int num = sc.nextInt();
int res = find(num);
System.out.println(res);
}
}
}

编辑于 2019-09-19 20:05:20 回复(0)