以下只YY算法,c++实现,java大神绕道。。。。。

(1)位数的估计

    显然对于大数(比如1000的阶乘)的阶乘我们找不到一个数据类型存放这个数,是在太大啦。。。。

    那么现在来估计一下这个数的位数:

    估计数n的位数的方法:log10(n)+1;

那么log10(n!)+1=log10(1)+log10(2)+...log10(n)+1,这在计算机中是很容易解决的;

 ps:斯特林公式:也可以用它两边取对数求得;

    斯特林公式推导

    

#include<cstdio>
#include<cmath>
int main()
{
int n,i;
double d;
while(scanf("%d",&n)!=EOF)
{
d=0;
for(i=1; i<=n; i++)
d+=log10(i);
printf("%d\n",(int) d+1);
}
return 0;
}

(2)求解n!的大小

看一个例子1567*12=18804:

   我们把前一个数分开为15、67,67*12=804、15*12=180,有下列狮子:

             15      67

   *                 12

-----------------------------

             8       04

    1       80

-----------------------------

    1       88       04

那么,计算n的阶乘的时候,n-1的阶乘肯定是很大的,(n-1)!*n就恰好是一个大数乘以一个小的数字;

比如我们计算0到1000的阶乘,那么计算1000!的阶乘有2568位,这个数就决定数组的要开的大小,开打啦会超时,开小啦不够,我们用一个数组存放阶乘,每一个数组单元存放4位,就可以计算出来啦,详情见代码中的注释吧!

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#define maxs 10000
//数组的设置的大小,不能开太大,这样的话扫描的时间太长会超时,也不能太小。。。。
using namespace std;
int a[maxs];
int main()
{
int n,i,j,y;
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));//把数组全部设置为0
for(i=1,a[maxs-1]=1;i<=n;i++)//数组的高位存放数的低位,把最低位置成1,从1乘到n
{
y=0;//余数
for(j=maxs-1;j>=0;j--)
{
a[j]=a[j]*i+y;
y=a[j]/10000;//得到乘法之后的结果
a[j]=a[j]%10000;//得到进位
}
}
for(i=0;i<maxs;i++)//从左到右扫描,第一个不是0的跳出
if(a[i])break;
printf("%d",a[i++]);//输出第一个不是0的
for(j=i;j<maxs;j++)
printf("%04d",a[j]);//注意中间的数字,比如12,由于在数的中间要输出0012
printf("\n");
}
return 0;
}

求 n! (大数问题)----------HDOJ1042的更多相关文章

  1. N的阶乘的长度 V2(斯特林近似) 求 某个大数的阶乘的位数 .

    求某个大数的阶乘的位数 . 得到的值  需要 +1 得到真正的位数 斯特林公式在理论和应用上都具有重要的价值,对于概率论的发展也有着重大的意义.在数学分析中,大多都是利用Г函数.级数和含参变量的积分等 ...

  2. C语言求大数的阶乘

    我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,该如何计算? 当一个数很大时,利用平常的方法是求不出来它的阶乘的,因为数据超出了范围.因此我们要用数组来求一个大数的阶乘,用数组的每位表示结果的 ...

  3. icpc 江苏 D Persona5 组合数学 大数阶乘(分段阶乘) 大数阶乘模板

    Persona5 is a famous video game. In the game, you are going to build relationship with your friends. ...

  4. 瘋子C++笔记

    瘋耔C++笔记 欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 参考:C++程序设计(谭浩强) 参考:http://c.biancheng.net/cpp/biancheng ...

  5. 【转】C语言快速幂取模算法小结

    (转自:http://www.jb51.net/article/54947.htm) 本文实例汇总了C语言实现的快速幂取模算法,是比较常见的算法.分享给大家供大家参考之用.具体如下: 首先,所谓的快速 ...

  6. HDU 1402 fft 模板题

    题目就是求一个大数的乘法 这里数字的位数有50000的长度,按平时的乘法方式计算,每一位相乘是要n^2的复杂度的,这肯定不行 我们可以将每一位分解后作为系数,如153 = 1*x^2 + 5*x^1 ...

  7. ACM题目————A除以B

    本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数.你需要输出商数Q和余数R,使得A = B * Q + R成立. 输入格式: 输入在1行中依次给出A和B,中间以1空格分隔. 输出格 ...

  8. YTU 2605: 熟悉题型——自由设计(比较大小-类模板)

    2605: 熟悉题型--自由设计(比较大小-类模板) 时间限制: 1 Sec  内存限制: 128 MB 提交: 125  解决: 107 题目描述 声明一个类模板,利用它分别实现两个整数.浮点数和字 ...

  9. 17周 oj 比較大小 类模板

    /*声明一个类模板,利用它分别实现两个整数. 浮点数和字符的比較,求出大数和小数. 说明:在类模板外定义各成员函数. 输入两个整数.两个浮点数和两个字符 从大到小输出两个整数.两个浮点数和两个字符 * ...

随机推荐

  1. 二十三种设计模式及其python实现

    本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Py ...

  2. Android 开发技巧

    1, ActionBar.setTitle() 的参数是 CharSequence,可以用SpannableString的,颜色字形随你

  3. Android 开发笔记 “SharePreference 数据存取”

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  4. Dapper 基础用法

    Dapper是.Net下的一个简单orm框架,具有以下特点: 1.简单,只需要一个文件即可(SqlMapper.cs) 2.快速,下面是一个查询结果集在500以上的运行速度对比 3.不要求特定的db ...

  5. Qt+SQLite数据加密的一种思路(内存数据库)

    了解Qt是比较早的,可是一直没有耐心去做一个练习.近期花了差不多两周时间做了次Qt开发练习,基本完成了Qt的入门,逃脱微软平台又迈出了几小步.Qt虽然是C++的,但开发应用是比较方便的,我觉得它在界面 ...

  6. python urllib和urllib2 区别

    python有一个基础的库叫httplib.httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现 ...

  7. HDU p1294 Rooted Trees Problem 解题报告

    http://www.cnblogs.com/keam37/p/3639294.html keam所有 转载请注明出处 Problem Description Give you two definit ...

  8. 2015暑假acm短训小结

    时间很快,短训已经结束,短短20天,心里有一些思绪想要记下. 收获: 从最近发的随笔中可以看出,做得最多的是搜索——Dfs,Bfs.对于搜索,如何描述状态,如何压缩状态,如何决定下一个结点,是否可以剪 ...

  9. BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

    题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solve ...

  10. SPI通信

    SPI是由Motorola公司提出的一种同步串行外围接口:它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用: SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是 ...