NYOJ1026 阶乘末尾非0 【模板】

阶乘末尾非0

时间限制:2000 ms  |  内存限制:65535 KB

难度:3

描述
我们的问题很是简单,n!末尾非0数是几?

比如n=5的时候,n!=120,那么n!末尾非0数是2.

输入
多组数据,

每组数据占一行,每行一个整数0<=n<=10^1000

输出
n!末尾非0数。
样例输入
5
样例输出
2

直接用的网上的模板

/*==================================================*| 阶乘最后非零位,复杂度 O(nlogn)
\*==================================================*/
//返回该位, n 以字符串方式传入
#include <string.h>
#include <stdio.h>
#define MAXN 10000
int a[MAXN];
char str[MAXN];
const int mod[20]={1,1,2,6,4,2,2,4,2,8,4,
					4,8,4,6,8,8,6,8,2};
int lastdigit(char* buf){
	int len=strlen(buf),i,c,ret=1;
	if (len==1) return mod[buf[0]-'0'];
	for (i=0;i<len;i++) a[i]=buf[len-1-i]-'0';
	for (;len;len-=!a[len-1]){
		ret=ret*mod[a[1]%2*10+a[0]]%5;
		for (c=0,i=len-1;i>=0;i--)
			c=c*10+a[i],a[i]=c/5,c%=5;
	}
	return ret+ret%2*5;
}

int main(){
	while(scanf("%s", str) == 1){
		printf("%d\n", lastdigit(str));
	}
	return 0;
}

NYOJ1026 阶乘末尾非0 【模板】,布布扣,bubuko.com

时间: 2024-11-05 13:46:41

NYOJ1026 阶乘末尾非0 【模板】的相关文章

Last non-zero Digit in N!(阶乘最后非0位)

Last non-zero Digit in N! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5861    Accepted Submission(s): 1451 Problem Description The expression N!, read as "N factorial," denotes the pro

哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入

题目:哪几个数的阶乘末尾有n个0?其中n是一个正整数,从键盘输入. 1 int main( void ) /* name: zerotail.cpp */ 2 { int num, n, c, m; 3 cout<<"输入零的个数(>0):"; cin>>n; 4 while( n>0 ) 5 { c=0; num=0; 6 do 7 { num+=5; 8 m=num; 9 while( m%5==0 ) 10 { c++; 11 m/=5; 12

LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 &amp; 二分

题目链接:http://lightoj.com/volume_showproblem.php?problem=1138 题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0:如果没有输出impossible 可以用二分求结果,重点是求一个数的阶乘中末尾含有0的个数,一定和因子5和2的个数有关,因子为2的明显比5多,所以我们只需要求一个数的阶乘的因子中一共有多少个5即可; LL Find(LL x) { LL ans = 0; while(x) { ans += x/5; x /=

hdu 1124 Factorial 数论,就是求一个数的阶乘的结果末尾有多少0.

Factorial Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2990    Accepted Submission(s): 1921 Problem Description The most important part of a GSM network is so called Base Transceiver Station

求一个数阶乘末尾0的个数

#include<iostream> using namespace std; //给定一个整数N,那么N的阶乘末尾有几个0?N=10,N!=3628800,末尾有2个0 //1.如果我们从"哪些数相乘能得到 10"这个角度来考虑,问题就变得简单了. //首先考虑,如果 N!= K×10M,且 K 不能被 10 整除,那么 N!末尾有 M 个 0.再考虑 //对 N!进行质因数分解,N!=(2x)×(3y)×(5z)-,由于 10 = 2×5,所以 M 只跟 X 和 Z /

阶乘末尾0的个数(证明)

先给出算法: 给定n,求n的阶乘末尾0的个数. int res = 0; while (n > 0) { res += n / 5; n /= 5; } 因为: 比方说求15的阶乘,也就是求 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13 × 14 × 15 的末尾0的个数.现在我们把这15个数分解出来含有5的因子 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 2   × 11 × 12 × 13 × 14 ×

阶乘末尾0的个数

问题很简单:给定一个整数n,那么n的阶乘末尾有多少个连续的0呢? 那个可以去求这个阶乘吗,大数的代码上去一套?这个大数求出来肯定是很慢的,还有其他方法吗,你可以观察一个产生0,本质是2*5,出现了2一定会出现5,2的个数会大于5的个数,所以我可以直接统计5的个数,统计每个数有几个因子5 #include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { int num = 0 ,i

hdu 1066 Last non-zero Digit in N! (数论——n!中的最后一个非0数字)

Last non-zero Digit in N! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6432    Accepted Submission(s): 1593 Problem Description The expression N!, read as "N factorial," denotes the pro

求N!末尾的0的个数--找规律+递归

0\'s Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 计算整数n!(n的阶乘)末尾有多少个0. 输入 第一行输入一个数T代表测试数据个数(T<=20).接下来T行每行1个数代表n(0<=n< 2^31). 输出 对于每个测试数据输n!末尾有多少个0,每行输出一个结果. 示例输入 3 1 5 10 示例输出 0 1 2 提示 中国海洋大学第三届"朗讯杯"编程比赛高级组试题 声明(摘抄至某前辈)--