SCU - 1689 算阶乘(10000的阶乘)

题目:

Description

求给定数的阶乘。

输入

第一行为测试数据的组数n,后面有n个测试数据。每组测试数据一行,为一个不超过10000的非负整数。

可以保证,最后运算结果以十进制表示不会超过36000位。

输出

对于每组测试数据,输出一行,即相应的阶乘。

输入示例

3
2
3
4

输出示例

2
6
24

用数组来自定义整数的存储、乘法、输出,把1个数按照每5位切开,存到1个数组里面。

代码:

#include<iostream>
#include<stdio.h>
#include<iomanip>
using namespace std;

int list[1002][7201];
int l[11][7201];

void f(int n, int k)	//k从0到10
{
	for (int j = 1; j <= 7200; j++)l[0][j] = list[n][j];
	for (int i = 1; i <= k; i++)
	{
		for (int j = 1; j <= 7200; j++)l[i][j] = l[i - 1][j] * (10 * (n - 1) + i);
		int temp = 0;
		for (int j = 1; j <= 7200; j++)
		{
			l[i][j] += temp;
			temp = l[i][j] / 100000;
			l[i][j] %= 100000;
		}
	}
}

void build()
{
	for (int i =2; i <= 1001; i++)
	{
		f(i - 1, 10);
		for (int j = 1; j <= 7200; j++)list[i][j] = l[10][j];
	}
}

void out(int n)
{
	int k = n - n / 10 * 10;
	f(n / 10 + 1, k);
	bool flag = false;
	for (int j = 7200; j > 0; j--)
	{
		if (flag)printf("%05d", l[k][j]);
		else if (l[k][j])
		{
			printf("%d", l[k][j]);
			flag = true;
		}
	}
}

int main()
{
	int t, n;
	cin >> t;
	for (int j = 7200; j > 0; j--)list[1][j] = 0;
	list[1][1] = 1;
	build();
	while (t--)
	{
		cin >> n;
		out(n);
		cout << endl;
	}
	return 0;
}

这个代码AC了。440ms

虽然build算出了1到10000所有数的阶乘,但是只存了1001个。

我做了测试,测试内容很简单,如果n是10000就输出1,结果就不能AC了。也就是说,测试数据刚好是到10000的。

我用word统计了一下,10000!有35660位。所以只能通过稀疏存储来防止爆内存。

f中的参数k是0到9,f在2个地方被调用。

build中调用的f的参数k都是10,out中都是0到9,还是挺有意思的。

时间: 2024-08-06 11:53:55

SCU - 1689 算阶乘(10000的阶乘)的相关文章

10000的阶乘

public class SuperFactories { public static int lastWithUnZero = 3;// 方便输出测试,从后面数,找到一个非零元素为止 public static void main(String[] args) { int[] factories_10000 = new int[35660];// 用数组装下阶乘的每一位 // 5的阶乘为120 factories_10000[2] = 1; factories_10000[1] = 2; //

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10

计算下10000! 的阶乘的结果是多少位?

好奇自己算了下.结果是: 284625968091705451890641321211986889014805140170279923079417999427441134000376444377299078675778477581588406214231752883004233994015351873905242116138271617481982419982759241828925978789812425312059465996259867065601615720360323979263287

java 10000的阶乘

package test; import java.math.BigInteger; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class MyTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); List<Int

51nod 1189 阶乘分数(阶乘素因子分解)

题目链接:传送门 分析: 1/n! = 1/x +1/y ==>  n! * (x + y) = x * y ==>  n!^2 = (x - n!)*(y - n!) ==>  a = b * c ,a = n!^2 ,b = x - n! ,c = y - n! 因此题目就转化成求a的约数的问题了,然后对a进行素 因子分解就可以了,统计的时候记得去重. 代码如下: #include <iostream> #include <cstring> #include

10000阶乘

public class SuperFactories { public static int lastWithUnZero = 3;// 便捷的输出测试,从几个回.为了找到一个非零元素迄今 public static void main(String[] args) { int[] factories_10000 = new int[35660];// 用数组装下阶乘的每一位 // 5的阶乘为120 factories_10000[2] = 1; factories_10000[1] = 2;

#转 大数阶乘算法

大数阶乘算法 大数阶乘算法 前几天朋友问我一个问题:“10000的阶乘怎么算?”当时我就有点懵,“10000”这个数字太大了,无论用什么数据类型保存结果都会溢出.这可怎么办呢?一时间束手无策.然后被一顿鄙视.后来经朋友的提醒,才恍然大悟,终于知道怎么实现了,原来是使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算.看起来还是挺有用的.我把它用程序实现出来,如果有用到的地方还可以借鉴一下.(最起码还可以拿来鄙视别人^_^)首先定义一个足够长的

阶乘的计算以及大数的表示

一.精确计算1000!的阶乘 1000!有多大呢?拿微软自带的计算器一算,结果是4.02*10^2567,共有2568位. 在C语言中我们没有能够精确表示这个数字的数据类型. 如果非要计算,那么只能以数组的形式存放每一位数字. 代码不太难,如下: 1 #include <stdio.h> 2 #include <string.h> 3 4 #define maxn 3000 5 6 int f[maxn]; 7 8 int main() 9 { 10 int i, j, n; 11

杭电acm:大数阶乘(附源码)

Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one line, process to the end of file. Output For each N, output N! in one line. Sample Input 1 2 3 Sample Output 1 2 6 #include <stdio.h> int main() {