阶乘问题

P1134

欢迎进入@shuai:阶乘问题;

题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
12的阶乘最右边的非零位为66。
写一个程序,计算N(1≤N≤50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。

输入输出格式
输入格式:
仅一行包含一个正整数N。

输出格式:
一个整数,表示最右边的非零位的值。

输入输出样例
输入样例#1:
12
输出样例#1:
6
源代码来了,,,,

#include<stdio.h>
main()
{
	long long int n,i,j,l=1,k=0,ans=0,m=0;
	scanf("%lld",&n);
		for(int j=1;j<=n;j++){
			l*=j;
		}
	while(1){
		m=l%10;
		if(m!=0){
			break;
		}
		l/=10;
	}
	printf("%lld",m);
}

代码解释:

  1. 纯纯的一道水题,不解释了
  2. 用%10来提取最后一位,用除以来盖掉一位,
  3. 加油,你是中国IT的希望 QAQ …

运行图片如下

#include<bits/stdc++.h>
QAQ
推荐相关题目:
明明的随机数:https://www.luogu.org/problemnew/show/P1059
分数线划定:https://www.luogu.org/problemnew/show/P1068
宇宙总统:https://www.luogu.org/problemnew/show/P1781
发现错误,疑惑不解,联系作者:1939096278@qq.com
欢迎联系呦 -------- QAQ ---------;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一个比较有趣的数学问题。我们可以通过寻找规律,简化计算过程。 首先,我们知道,一个数的阶乘末尾有多少个零,取决于它可以分解出多少个因子 10,而 10 可以分解为 2 和 5 相乘得到。因此,我们只需要计算 N! 中因子 2 和因子 5 的个数,取其中较小的那个作为 N! 末尾的零的个数。 但是,这个问题的并不是末尾的零的个数,而是最右边的非零位。我们可以通过对每个因子进行分解,找出相乘后最右边的非零位的规律。 我们可以发现,对于一个数 x,如果它的最右边的非零位是 k,那么 x 乘以任何一个以 5 为末尾的数字都会让最右边的非零位变成 k。因此,我们只需要找到 N! 中所有因子中最右边的非零位,然后将它们依次乘以 1、2、3、4……N 中末尾为 1、3、7、9 的数字,找到其中最右边的非零位即可。 下面是 Python 代码实现: ```python def rightmost_nonzero_digit(n): # 计算因子 2 和因子 5 的个数 num_2, num_5 = 0, 0 for i in range(1, n+1): x = i while x % 2 == 0: num_2 += 1 x //= 2 while x % 5 == 0: num_5 += 1 x //= 5 # 计算所有因子中最右边的非零位 last_digit = 1 for i in range(1, n+1): x = i while x % 10 == 0: x //= 10 last_digit = (last_digit * x) % 10 # 将最右边的非零位乘以 1、2、3、4……N 中末尾为 1、3、7、9 的数字,找到其中最右边的非零位 if num_2 > num_5: for i in [1, 3, 7, 9]: if (i * pow(2, num_2 - num_5, 10) * last_digit) % 10 != 0: return (i * pow(2, num_2 - num_5, 10) * last_digit) % 10 else: for i in [1, 3, 7, 9]: if (i * pow(5, num_5 - num_2, 10) * last_digit) % 10 != 0: return (i * pow(5, num_5 - num_2, 10) * last_digit) % 10 ``` 注意,在计算最右边的非零位时,我们需要用到取模运算,以避免超出计算机能处理的整数范围。同时,我们还需要注意一些细节,例如排除因子中末尾为 0 的数字,以及在计算 2 和 5 的个数时,我们只需要统计它们在因子中的出现次数,而不是每个因子都进行分解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值