算法篇——阶乘的精确值

  来源:《算法竞赛入门经典》例题5.2.2

  题目:输入不超过1000的正整数n,输出n!=1*2*3*…*n的精确结果。

  样例输入:30

  样例输出:265252859812191058636308480000000

  分析:为了保存结果,需要分析1000!有多大。用计算器算一算不难知道,1000!约等于4*102567,因此可以用一个3000个元素的数组buf保存。为了方便起见,我们让f[0]保存结果的个位,f[1]是十位,f[2]是百位……(为什么要从低位逆序表示呢?因为如果从低位顺序表示,一旦进位的话就……),则每次只需要模拟手算即可完成n!。在输出时需要忽略前导0

  源码

  

#include<stdio.h>
#include<string.h>

const int maxn = 3000;
int buf[maxn];

int n_factorial()
{
    int i,j,n,s,c;
    scanf("%d",&n);
    memset(buf,0,sizeof(buf));    //把数组f置0
    buf[0]=1;
    for(i=2;i<=n;i++)            //循环乘i
    {
        c=0;
        for(j=0;j<maxn;j++)     //每一位都与都乘i(模拟手算)
        {
            s = buf[j] * i + c;
            buf[j] = s%10;    //保留在该位
            c = s/10;        //向上一位的进位
        }
    }
    /*    输出结果    */
    for(j=maxn-1;j>=0;j--)
        if(buf[j])    break;    //忽略前导0
    for(i=j;i>=0;i--)
        printf("%d",buf[i]);
    printf("\n");

    return 0;
}
时间: 2024-10-13 16:27:56

算法篇——阶乘的精确值的相关文章

阶乘的精确值

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

深度学习word2vec笔记之算法篇

深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明word2vec的具体原理和算法,所以老衲就斗胆整理了一个笔记,希望能帮助各位尽快理解word2vec的基本原理,避免浪费时间. 当然如果已经了解了,就随便看看得了. 一. CBOW加层次的网络结构与使用说明 Word2vec总共有两种类

插入排序——一步一步算法篇

插入排序 算法思想:将待排序的数据放在一个数组中,并设置一个中间量m,用来存储每次插入比较的元素. (1) a[1]自成1个有序区,无序区为a[2..n]; (2) 从i=2起直至i=n为止,将a[i]放在恰当的位置,使a[1..i]数据序列有序; ① m:=a[i]; ② 将m与前i-1个数比较 , j:=i-1; while(x #include<iostream> #include<cstdio> #include<cstring> #include<str

冒泡排序——一步一步算法篇

基本思想:依次比较相邻的两个数,并两两交换,使大(或小)的数不停向前推进,以此类推-- 由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序. #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int main() { int n,a[1000],i,j,k,m; cin>>n; memset(a,

算法篇——因子和阶乘

来源:<算法竞赛入门经典>例题5.4.2 题目:输入正整数n(2≤n≤100),把阶乘n!=1*2*3*...*n分解成素因子相乘的形式,从小到大输出各个素数(2.3.5...)的指数.例如,5! 表示为 3 1 1(5!=23*31*51=120),程序忽略比最大素因子更大的素数(否则末尾会有无穷多个0) 样例输入: 5 53 样例输出: 5! = 3 1 1 53! = 49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1 分析: 注意到n<=100,所以素因子也一定

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

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

《算法竞赛入门经典》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",

求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

算法-计算阶乘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