求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,0,sizeof(f));
        f[0]=1;  //f[0] 必须初始为1
        for(i=2;i<=n;i++)
        {
            c=0; //进位
            for(j=0;j<N;j++)
            {
                f[j]=f[j]*i+c;
                c=f[j]/10;
                f[j]=f[j]%10;
            }
        }
        for(i=N-1;i>=0;i--) if(f[i]) break; //忽略前导0
        for(j=i;j>=0;j--) printf("%d",f[j]);
        printf("\n");
    }
    return 0;
}

但是当n太大的时候,比如10000,上述算法会超时,所以 还可以采用一种万进位的方法,就是数组中的每一个数都保存4位数,超过四位数才进位,形式跟上面类似,但是减少了循环次数,节省时间。

#include<stdio.h>
#include<string.h>
#define N 10000
int f[N]; //每一个数保存阶乘中的四位数
int main()
{
    int n,i,j,p,c; //p表示已经用了数组的几个数  c是进位
    while(~scanf("%d",&n))
    {
        memset(f,0,sizeof(f));
        f[0]=1;
        p=1;
        for(i=2;i<=n;i++)
        {
            c=0;
            for(j=0;j<p;j++)
            {
                f[j]=f[j]*i+c;
                c=f[j]/N;
                f[j]=f[j]%N;
            }
            if(c)
            {
                p++;
                f[p-1]+=c;
            }
        }
        printf("%d",f[p-1]);
        for(i=p-2;i>=0;i--)
            printf("%04d",f[i]);  //不足4位前面补0
        printf("\n");
    }
    return 0;
}
时间: 2024-10-20 01:11:16

求n的阶乘的精确值的相关文章

阶乘的精确值

问题描述:输入不超过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(Stri

汇编语言-求X的阶乘

1. 题目:求X的阶乘值 2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现. 3. 提示:可以用递归来实现,也可以用简单的循环来实现. 这里使用循环来实现: 对于汇编新手,最好通过高级语言的编程测试,然后再写汇编代码,这样效果会好一些. 求阶乘的C++代码如下: 1 //The program is to find the factorial from 1 to 10 2 //author:Karllen 3 //Date: 05/21/2014 4 5

求n的阶乘以及前n个数的阶乘和

//求n的阶乘 #include<stdio.h> #include<stdlib.h> int main() { int n = 0; int sum = 1; scanf( "%d", &n); while (n)                             //n如果为零,则不进入循环体,输出的sum初始值就是1 { sum *=n; n--; } printf( "%d\n", sum); system( &quo

求一个数阶乘的位数

flyfish 2015-8-15 例如 7!=5040 ,7的阶乘结果是4位数(10进制) 求一个数的位数 1 循环方法 int get_digit_loop(int N) { int digit = 0; do { digit ++; } while ((N /= 10) > 0); return digit; } 2 递归方式 int get_digit_recursion(int N) { int digit = 0; digit = N < 10 ? 1 : 1 + get_digi

求一个数阶乘后位数问题

问题:In many applications very large integers numbers are required. Some of these applications are using keys for secure transmission of data, encryption, etc. In this problem you are given a number, you have to determine the number of digits in the fa

大数问题:求n的阶乘

题目:求100! 这看起来是一个非常简答的问题,递归解之毫无压力 int func(int n){ if(n <= 1) return 1; else return n*func(n-1); } 但你会发现,题目真的有这么简单吗,考虑整形数据越界没有? 这实际上是一个大数问题! 大数怎么表示呢,非常直接的.我们会想到用字符串来表示.但表示的过程中还得做阶乘运算.是不是想象的那么复杂呢? 事实上.用主要的乘法运算思想(从个位到高位逐位相乘,进位)来考虑,将暂时结果的每位与阶乘元素相乘.向高位进位.

2717: 递归函数求n的阶乘

2717: 递归函数求n的阶乘 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1329  Solved: 942[Submit][Status][Web Board] Description 输入一个正整数n,利用递归函数求n的阶乘. 递归函数声明如下: int  fac(int n);  //求n!的递归函数声明 Input 一个正整数n Output n的阶乘值 Sample Input 5 Sample Output 120 HINT 使用递

两种方式实现求n的阶乘

# 通过递归实现求n的阶乘 def my_test(n): if n is 0: return 1 else: return n*my_test(n-1) print(my_test(5)) >> 120 # 通过普通循环实现求n的阶乘 def my_test2(n): result = n for i in range(1,n): result *= i return result print(my_test2(5)) >> 120 原文地址:http://blog.51cto.

递归和非递归分别实现求n的阶乘

思路:举例求6的阶乘,6*5*4*3*2*1.可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,.而递归也是如此,每次调用函数的时候将变量减一就可以. 方法一:非递归 1 //非递归: 2 #include<stdio.h> 3 int main() 4 { 5 int num = 1; 6 printf("请输入数字:\n"); 7 scanf("%d",&num); 8 int n = num - 1; 9 while (n &