实例:输入n,计算S = 1! + 2! + 3! + 4! + ... + n!的末六位(不含前导0)。其中 n ≤ 106

分析:考虑到数据溢出后程序如下:

#include <stdio.h>
int main(void)
{
int n, i;
int sum = ;
int factorial = ;
scanf("%d", &n); for(i = ; i <= n; i++)
{
factorial = (factorial * i) % ;
sum = (sum + factorial) % ;
} printf("%d\n", sum); return ;
}

作者源程序如下:

#include <stdio.h>
#include <time.h>
int main(void)
{
const int MOD = ;
int i, j, n, S = ;
scanf("%d", &n); for(i = ; i<= n; i++)
{
int factorial = ;
for(j = ; j <= i; j++)
factorial = (factorial * j % MOD);
S = (S + factorial) % MOD;
} printf("%d\n", S % );
printf("Time used = %.2lf\n", (double)clock() / CLOCKS_PER_SEC); return ;
}

值得借鉴的是该程序可以计时,使用time.h库中的函数clock()函数返回程序目前为止运行时间,该时间除以常数CLOCKS_PER_SEC得到的值以"秒"为单位。其中常数CLOCKS_PER_SEC和操作系统相关。因此不要直接使用clock()的返回值。据此,我们在程序结束之前调用该函数,就可以得到整个程序的运行时间。

一个问题是我们通过命令行运行程序的时候键盘输入时间也被计算在内。我们利用管道来避免键盘输入时间对测试结果的干扰。Windows系统中,在编译好的程序所在目录下执行命令行命令 echo 20 | FactSum,其中20是要输入的数据,FactSum是程序名。这样操作系统会自动帮我们把20输入程序,因此可以避免键盘输入时间。

关于算法的运行时间分析我在这里做了一些详细得论述,因此我们可以直接得出结论:该算法的运行时间为O(N2),我写的第一个程序是线性时间O(N)。

下面我们来检验一下分析是否正确,一般有两种常用方法可以采用:

一种是编程并比较实际观察到的运行时间与通过分析所描述的运行时间是否相匹配。当N扩大一倍时,线性程序的运行时间乘以因子2,二次程序的运行时间乘以因子4等等。

验证一个程序是否是O(f(N))的另一个常用的技巧是对N的某个范围(通常用2的倍数隔开),计算比值 T(N) / f(N),其中T(N)是实际运行时间。如果f(N)是运行时间的理想近似,那么算出的值收敛于一个正常数。如果f(N)估计过大,则算出的值收敛于零。如果f(N)估计过低,那么算出的值发散。

最后多次测试,根据运行时间表可以得到程序的运行时间,与我们的分析比较即可,这里涉及作图,并且不同配置的机器实际运行时间都有差别,因此运行时间表就在此省略了。另外在本机上多次测试50000得到的平均运行时间是运行时间是17.60,由此我们可以大胆预测,输入为n = 10^6时,程序需要运行17.60*(10^6/ 50000)^2秒,约为1.96个小时程序才能跑完(另:第一个线性时间的程序几乎是瞬间给出了答案)。那么如何解决这个问题呢,一个就是直接用第一个程序,另一个就需要一点观察力了,我们做出一张输出结果表,发现从n=25开始,结果都不变,为940313。我们可以写一个程序求出25!发现其末尾有6个零,所以从第25项开始,后面所有的项都不影响和的末6位数字,因此在该程序的最前面加上一条语句:if(n > 25) n = 25;这样效率和溢出都不成问题了。

All Rights Reserved.
Author:海峰:)
Copyright © xp_jiang.
转载请标明出处:http://www.cnblogs.com/xpjiang/p/4153672.html
参考资料:
《算法竞赛入门经典》——刘汝佳
《数据结构与算法分析:C语言描述_原书第二版》——Mark Allen Weiss

阶乘之和 & 程序运行时间 & 算法分析的更多相关文章

  1. HPU 第三次积分赛:阶乘之和(水题)

    阶乘之和 描述 对于整数pp,给出以下定义 p=x_{1}!+x_{2}!+x_{3}!+...+x_{q}!(x_{i}<x_{j}for\ all\ i<j )p=x1​!+x2​!+ ...

  2. 7.20试机测 T3 阶乘之和 暴力AC题解

    7.20试机测  T3 阶乘之和 暴力AC题解 题外话:此乃本蒟蒻发表的第一篇题解,大家多多关照,支持一下,谢谢 题面 3.阶乘之和(sum.pas/in/out) 问题描述: 给定一个非负整数 n, ...

  3. 在 Linux 如何优雅的统计程序运行时间?恕我直言,你运行的可能是假 time

    最近在使用 time 命令时,无意间发现了一些隐藏的小秘密和强大功能,今天分享给大家. time 在 Linux 下是比较常用的命令,可以帮助我们方便的计算程序的运行时间,对比采用不同方案时程序的运行 ...

  4. 检测Java程序运行时间的2种方法(高精度的时间[纳秒]与低精度的时间[毫秒])

    第一种是以毫秒为单位计算的. 代码如下: long startTime=System.currentTimeMillis(); //获取开始时间 doSomeThing(); //测试的代码段 lon ...

  5. nyoj 91 阶乘之和(贪心)

    阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...

  6. ACM 阶乘之和

    阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3! ...

  7. 阶乘之和--nyoj91

    描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2!+3!,如果是,则输出Yes,否则输出No: 输入 第一行有一个整数0<m<10 ...

  8. PAT乙级 1026. 程序运行时间(15)

    1026. 程序运行时间(15) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 要获得一个C语言程序的运行时间, ...

  9. nyoj 91 阶乘之和

    点击打开链接 阶乘之和 时间限制:3000 ms  |  内存限制:65535 KB 难度: 描述 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为正数)的阶乘之和,如9=1!+2 ...

随机推荐

  1. 树莓派学Python博客收集

    http://www.geekfan.net/8657/  这个博客是控制LED,虽然不是原创地址不是这,但是我觉得排版比较好. http://my.oschina.net/RagingTyphoon ...

  2. Bootstrap页面布局21 - BS对话框设计

    设计弹出层对话框: 设计一个点击登录按钮,再弹出一个登陆对话框的实例,且带有动画效果 <div class='container-fluid'> <h2 class='page-he ...

  3. 微博app中常用正则表达式

    /* weibo.app 里面的正则,有兴趣的可以参考下: HTTP链接 (例如 http://www.weibo.com ): ([hH]ttp[s]{0,1})://[a-zA-Z0-9\.\-] ...

  4. 初入C的世界

    大家好,我叫吉贯之,来自贵州省遵义市,现就读于北京工业大学耿丹学院信息技术系计算机与科学专业,我的学号是160809127,我喜欢运动和一些电脑方面的软件操作. 应老师要求在博客园建立的博客,地址是h ...

  5. 如何在Qt 4程序中优化布局结构(表格讲解,很清楚)

    原文地址:http://blog.csdn.net/qter_wd007/archive/2010/03/13/5377882.aspx 在迄今为止讲到每一个例子中,我们只是简单的把窗口部件放置到某个 ...

  6. java中的trim()

    trim():去掉字符串首尾的空格.但该方法并不仅仅是去除空格,它能够去除从编码'\u0000′ 至 '\u0020′ 的所有字符. 回车换行也在这20个字符 例1: public static vo ...

  7. VMware中CentOS设置静态IP

    因为之前搭建的MongoDB分片没有采用副本集,最近现网压力较大,所以准备研究一下,于是在自己电脑的虚拟机中搭建环境,但是发现之前VMware设置的是DHCP,所以每次重新resume后虚拟机中IP都 ...

  8. shell 统计GMT0 时区的数据

    和某个供应商核对数据,对方是GMT+0时区,我方报表默认北京时间,无法修改为GMT0, 对excel中按照小时级别的数据导出到excel处理,然后转为文本文件,shell转为GMT0进行统计: 前期处 ...

  9. clang: error: no such file or directory: 报错

    clang: error: no such file or directory: '/Users/KuaiYong/Desktop/svn/gamebox_v1.2/SettingViewContro ...

  10. Windows-001-Win7系统变量设置

    本节主要讲述Windows系统环境变量配置介绍,以 Windows 7 为例讲解. 1.右键单击 计算机,选择 属性,进入 系统 界面,如下所示: 2.点击上图中的 高级系统设置,进入 系统属性 界面 ...