uva 568(数学)

题解:从1開始乘到n,由于结果仅仅要最后一位。所以每乘完一次,仅仅要保留后5位(少了值会不准确,刚開始仅仅保留了一位。结果到15就错了,保留多了int会溢出,比方3125就会出错) 和下一个数相乘,接着保留5位,注意5位没有后导零,最后取5位中最后一个不是零的就能够了。

#include <iostream>
#include <cstdio>
using namespace std;

int main() {
	int n;
	long int temp;
	while (scanf("%d", &n) != EOF) {
		if (n == 0) {
			printf("%5d -> 1\n", n);
			continue;
		}
		int a = 1;
		long int temp1;
		for (int i = 1; i <= n; i++) {
			temp = (i * a) % 10;
			if (temp == 0) {
				temp1 = i * a;
				while (temp == 0) {
					temp1 = temp1 / 10;
					temp = temp1 % 10;
				}
				a = temp1 % 100000;
			}
			else
				a = (i * a) % 100000;
		}
		printf("%5d -> %ld\n", n, temp);
	}
	return 0;
}
时间: 2024-12-28 20:59:26

uva 568(数学)的相关文章

Just the Facts UVA 568

说说:这道题的题意是求出给定的N!(N<=10000)的第一个非零的数.可以想象10000!是非常可怕的,所以我开始的想法是将1~10000的结果都求出来保存在数组中,然后直接调用即可.而求结果的方法是从1开始键乘,且只保存结果的最后非零的两位.因为在很多情况下,第一个非零的数与太后面的数是没什么关系的.按照这个思路测试了一下,发现比较小的数没问题,当N逐渐变大的时候,后面就全乱了.原因应该是暂存的结果再乘以新的N的时候前两位就是0,所以最后的结果其实是与暂存结果的第三位数有关的,因此结果至少要

UVa 568 Just the Facts

A过去后看了一下别人的解法,发现除了打表还有一种数论的方法. 分析一下阶乘后面的0是怎么出现的呢,当然是2乘5得到的. 我们将1~N先放在一个数组里面. 从数组第一个元素开始,先统计一下N!中因子为5的个数记为count,将其除去,然后再除去count个2.这样一来的话把所有元素乘起来后就不会出现10的倍数了. 当然并不是真正的乘起来,那样的话肯定是要溢出的,因为只关心最后一位数,所以每次乘完后求10的余数即可. 我的做法是打表,因为题目里给了N <= 10000的条件限制,所以可以把1~100

UVA 11889-Benefit(数学_快速枚举因子)

Recently Yaghoub is playing a new trick to sell some more. When somebody gives him A Tomans, he who never has appropriate changes, asks for B Tomans such that lowest common multiple of A and B equals to C and he will pay back a round bill. Or otherwi

UVA 10127- Ones 数学

Given any integer 0 ≤ n ≤ 10000 not divisibleby 2 or 5, some multiple of n is a number whichin decimal notation is a sequence of 1’s. Howmany digits are in the smallest such a multipleof n?InputA ?le of integers at one integer per line.OutputEach out

UVA 568 Just the Facts (阶乘)

题意:求一个数n的阶乘,其往后数第1个不是0的数字是多少. 思路:[1,n]逐个乘,出现后缀0就过滤掉,比如12300就变成123,继续算下去.为解决爆long long问题,将其余一个数mod,过滤掉前面过大的部分,因为计算出来也没用.这个mod应该是多少? 10亿就行. 1 #include <bits/stdc++.h> 2 #define LL long long 3 using namespace std; 4 const int N=10001; 5 const int mod=1

UVa 10943 (数学 递推) How do you add?

将K个不超过N的非负整数加起来,使它们的和为N,一共有多少种方法. 设d(i, j)表示j个不超过i的非负整数之和为i的方法数. d(i, j) = sum{ d(k, j-1) | 0 ≤ k ≤ i },可以理解为前j-1个数之和为i-k,最后一个数为k 还有一种更快的递推办法,把这个问题转化为将N个小球放到K个盒子中的方法数,盒子可以为空. 就等价于求x1 + x2 +...+ xK = N的非负整数解的个数,根据组合数学的知识容易算出结果为C(N+K-1, K-1). 所以也可以这样递推

uva 10061(数学)

题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共有多少位.首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = logM + logN,n! 的位数用公式可以化为( log(1) + log(2) +...+log(n) ) / log(b) + 1,为了精确再加 10^-6.阶乘后的零的数量计算是根据进制数的最大质因数和其数量确定的,比如10 = 2 × 5,所以10进制的最大质因数是5,数量是num = 1,例

uva 467 - Synching Signals(暴力+数学)

题目连接:uva 467 - Synching Signals 题目大意:有n个红绿灯,给出红灯的时间t,那么该灯从0时刻开始就以2*t为周期绿黄红三灯交替,时间分别为t-5,5,t.问所这n个等从第一变为有一个灯不为绿灯开始,要多久才能变成所有的灯刚好都为绿灯.时间超过1小时输出unable to synch after one hour. 解题思路:一小时才3600秒,枚举秒数判断即可. #include <cstdio> #include <cstring> #include

uva 618 - Doing Windows(暴力+数学)

题目链接:uva 618 - Doing Windows 题目大意:给出电脑桌面的大小W和H,现在在桌面上有4个窗口,给出窗口的初始大小,问说能不能通过调整各个窗口的大小(长宽比例不能变)使得4个屏幕刚好占满整个屏幕,并且互相不覆盖. 解题思路:其实可以直接暴力出所有情况,不过细节比较多,而且要考虑所有的细节. 我的做法的是先将4个窗口缩小至最小的状态,然后枚举左下角的窗口, 有四种可能 蓝色部分为另外枚举的窗口,3,4种情况要分别保证说长.宽相等,然后S部分就是子问题. 所以用一个二进制数来表