阶乘的精确值

问题描述:输入不超过1000的正整数,输出n!=1*2*3*...*n的结果

  1000!约等于4*10^2567   所以设置数组的最大范围为3000 并采用逆序表示 eg: 123000  因为是逆序 所以输出321

1.java

import java.util.Arrays;
import java.util.Scanner;/** * 阶乘的精确值 * @author NEU-2015 * */
public class Demo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int x;
        int[] array = new int[3000];       //逆序数组
        int s;
        int c;   //进位进了多少
        boolean flag;
        while(input.hasNext()) {
            x = input.nextInt();
            Arrays.fill(array, 0);
            array[0] = 1;           //设置初始值
            for(int i = 2; i <= x; i++) {
                c = 0;
                for(int j = 0; j < 3000; j++) {
                    s = array[j] * i + c;
                    array[j] = s % 10;
                    c = s/10;
                }
            }
            flag = true;
            for(int j = 3000-1; j >= 0; j--) {
                if(!(array[j] == 0) && flag) {    //除去高位第一个非零数前的0   eg: 123000  因为是逆序 所以输出321
                    flag = false;
                }
                if(!flag) {
                    System.out.print(array[j]);
                }
            }
            System.out.println();
        }
    }
}
时间: 2024-10-27 03:41:16

阶乘的精确值的相关文章

求n的阶乘的精确值

斯特林公式可以求出n!的近似值,但是如果需要求精确值的话,就要采取另外的办法了.' 当n<=1000的时候,可以直接模拟求阶乘,用一个数组保存阶乘的每一位,大概3000的数组就行.程序如下: #include<stdio.h> #include<string.h> #define N 3000 int f[N];//保存阶乘的位数 int main() { int n,i,j,c; while(~scanf("%d",&n)) { memset(f

【算法竞赛入门经典】阶乘的精确值

问题描述 输入不超过1000的正整数n,输出n! = 1x2x3x4x···xn的精确结果. 样例输入:5 样例输出:120 算法分析 我们需要解决两个问题: 怎么保存结果 乘法过程是怎样的 对于第一个问题:因为1000的阶乘是无法用整数保存的,用double也一样,它的位数会高达两千多位,保存阶乘值的位数,我们只能使用数组,这里使用一个大小为3000的数组: 对于第二个问题:我们可以模拟数学乘法过程,以1为基础数,并存入数组,从2开始,依次去乘以现有基础数的数组里的每一位,设置一个进位标识,然

c语言中阶乘的精确值

对于大数的操作,可能超出int,甚至long的表示范围,对此,可以使用数组来存储大数,下列代码为求1000以内数的阶乘的代码,代码如下: #include <stdio.h> #include<string.h> const int max=3000; int main() { int f[3000];//存放最终的结果 int i,j,n,c,tem; memset(f,0,sizeof(f)); scanf("%d",&n); f[0]=1; for

《算法竞赛入门经典》5.22阶乘的精确值

1 /* 2 *输入不超过1000的正整数n,输出n!=1*2*3*……*n的精确结果. 3 *样例输入:30 4 *样例输出:265252859812191058636308480000000 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define maxn 3000 9 int f[maxn]; 10 11 int main() 12 { 13 int i, j, n; 14 scanf("%d",

大阶乘大精确值

#include <stdio.h> #include <string.h> const int maxn =3000; int main() { int f[maxn]; memset(f, 0, sizeof(f)); int i,j,n;f[0]=1; scanf("%d",&n); for (i=2; i<=n; i++) { int c=0; for(j=0;j<=maxn;j++) { int s=f[j]*i+c; f[j]=s

算法篇——阶乘的精确值

来源:<算法竞赛入门经典>例题5.2.2 题目:输入不超过1000的正整数n,输出n!=1*2*3*…*n的精确结果. 样例输入:30 样例输出:265252859812191058636308480000000 分析:为了保存结果,需要分析1000!有多大.用计算器算一算不难知道,1000!约等于4*102567,因此可以用一个3000个元素的数组buf保存.为了方便起见,我们让f[0]保存结果的个位,f[1]是十位,f[2]是百位……(为什么要从低位逆序表示呢?因为如果从低位顺序表示,一旦

大数阶乘的位数和精确值计算【转】

来源:http://www.cnblogs.com/stonehat/p/3603267.html 在此,顶礼膜拜一下原文作者呵呵 我们知道整数n的位数的计算方法为:log10(n)+1 故n!的位数为log10(n!)+1 如果要求出n!的具体值,对很大的n(例如n=1000000)来说,计算会很慢,如果仅仅是求阶乘的位数,可以用斯特林(Stirling)公式求解 斯特林(Stirling)公式: 于是求n!的位数就是求log10((2*PI*n)^1/2*(n/e)^n)+1 即 1/2*l

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

算法-计算阶乘n!末尾0的个数

算法逻辑转载自计算阶乘n!末尾0的个数: 问题描述    给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数.    例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 计算公式    这里先给出其计算公式,后面给出推导过程.    令f(x)表示正整数x末尾所含有的&q