题目:http://acm.hdu.edu.cn/showproblem.php?pid=1042

题意:

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
是不是很简单呢?
一般方法:
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. const int MAXN = ;
  5. int a[MAXN];
  6.  
  7. int main()
  8. {
  9. int N, k, temp;
  10. while(scanf("%d", &N)!=EOF)
  11. {
  12. memset(a, , sizeof(a));
  13. a[]=;
  14. for(int i=; i<=N; i++)
  15. {
  16. k=;
  17. for(int j=; j<MAXN; j++)
  18. {
  19. a[j]=a[j]*i+k;
  20. k=a[j]/;
  21. a[j]%=;
  22. }
  23. }
  24. int t;
  25. for(t=MAXN-; t>=; t--)
  26. if(a[t])
  27. {
  28. //cout<<t<<endl;
  29. break;
  30. }
  31. for(int i=t; i>=; i--)
  32. printf("%d", a[i]);
  33. printf("\n");
  34. }
  35. return ;
  36. }

上面的代码是不是和你的想法相同呢?, 很遗憾, 上述代码一定会超时! 那么 , 能不能把数组开小些呢? ----> 不能。 当N=10000时, 你会发现数组要开到9999。很明显, 这道题就是要卡你的时间, 就是要卡你的优化。 下面是两个优化思路:

1. 合并计算:  从而减少计算次数, 例如 你在每个a[i]中存10000数量级的数, 然后这个数组的长度就成2000啦! 但是这种算法在实现时要考虑很多情况, 比较繁琐!

2.过程优化: 由于结果值在计算时, 数位变化很大, 但是上述代码, 在计算时每次都按MAXN-1 位计算, 所以做了很多的无用功。如果每次计算时都顺带着算出位数, 这样就可以节省很多时间。代码只需稍加改动即可!

3.综合使用前两种方法!

由于第一和第三中方法较繁琐, 我不再理会!

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. const int MAXN=;
  6. int a[MAXN];
  7.  
  8. int main()
  9. {
  10. int N;
  11. int k,count,temp;
  12. while(scanf("%d", &N)!=EOF)
  13. {
  14. a[]=;
  15. count=;
  16. for(int i=;i<=N;i++)
  17. {
  18. k=;
  19. for(int j=;j<count;j++)
  20. {
  21. temp=a[j]*i+k;
  22. a[j]=temp%;
  23. k=temp/;
  24. }
  25. while(k)//¼Ç¼½øλ
  26. {
  27. a[count++]=k%;
  28. k/=;
  29. }
  30. }
  31. for(int i=count-;i>=;i--)
  32. printf("%d", a[i]);
  33. printf("\n");
  34. }
  35. return ;
  36. }

耗时: 1045MS  时限是5s。

然而:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. const int MAXN = ;
  6. int main()
  7. {
  8. int n, a[MAXN];
  9. int i, j, k, count, temp;
  10. while(cin>>n)
  11. {
  12. a[]=;
  13. count=;
  14. for(i=; i<=n; i++)
  15. {
  16. k=;
  17. for(j=; j<=count; j++)
  18. {
  19. temp=a[j]*i+k;
  20. a[j]=temp%;
  21. k=temp/;
  22. }
  23. while(k)
  24. {
  25. a[count++]=k%;
  26. k/=;
  27. }
  28. }
  29. for(j=MAXN-; j>=; j--)
  30. if(a[j])
  31. break;
  32. for(i=count-; i>=; i--)
  33. cout<<a[i];
  34. cout<<endl;
  35. }
  36. return ;
  37. }

耗时: 811MS    很是令人费解! cin和cout不应该比scanf等慢吗? , 然而事实就是这样, 看来,书上说的也未必正确 。 虽然这个道理大家都懂, 但是不知不觉中还是迷信权威。 现实情况是千变万化的, 面对不同的情况会有意料之外的结果。 所以永远不要自以为是,永远不要把话说的太绝对, -------好像陷入悖论啦。 呵呵!

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

杭电HDU1042(有点坑的高精度)的更多相关文章

  1. SCAU1143 多少个Fibonacci数--大菲波数【杭电-HDOJ-1715】--高精度加法--Fibonacci数---大数比较

    /*******对读者说(哈哈如果有人看的话23333)哈哈大杰是华农的19级软件工程新手,才疏学浅但是秉着校科联的那句“主动才会有故事”还是大胆的做了一下建一个卑微博客的尝试,想法自己之后学到东西都 ...

  2. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  3. 高手看了,感觉惨不忍睹——关于“【ACM】杭电ACM题一直WA求高手看看代码”

    按 被中科大软件学院二年级研究生 HCOONa 骂为“误人子弟”之后(见:<中科大的那位,敢更不要脸点么?> ),继续“误人子弟”. 问题: 题目:(感谢 王爱学志 网友对题目给出的翻译) ...

  4. 杭电 1272 POJ 1308 小希的迷宫

    这道题是我学了并查集过后做的第三个题,教我们的学姐说这是并查集的基础题,所以有必要牢牢掌握. 下面就我做这道题的经验,给大家一些建议吧!当然,我的建议不是最好的,还请各位大神指出我的错误来,我也好改正 ...

  5. 2017杭电ACM集训队单人排位赛 - 6

    2017杭电ACM集训队单人排位赛 - 6 排名 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 59 1 X X 1 1 X X 0 1 ...

  6. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

  7. 杭电acm刷题顺序

    最近兴趣来了,闲暇之余,回顾大学期间刷过的杭电acm那些入门级别的题,以此巩固基础知识! 以下参考刷题顺序,避免入坑 原文传送门:https://blog.csdn.net/liuqiyao_01/a ...

  8. acm入门 杭电1001题 有关溢出的考虑

    最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM( ...

  9. 杭电acm 1002 大数模板(一)

    从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...

随机推荐

  1. Java中Properties类的使用

    1.properties介绍 java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值&quo ...

  2. drupal 自定义表单调用autocomplete主标签实现方法

    代码如下: <php function module_name_form() { $form = array(); $form['city'] = array( '#title' => t ...

  3. 怎么使用PHP获取用户客户端真实IP的解决方案呢?

    function getIp(){if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIE ...

  4. greenplum如何激活,同步,删除standby和恢复原始master

    在Master失效时,同步程序会停止,Standby可以被在本机被激活,激活Standby时,同步日志被用来恢复Master最后一次事务成功提交时的状态.在激活Standby时还可以指定一个新的Sta ...

  5. Java JDBC 驱动 MySQL

    MySQL: 1>下载地址:http://www.mysql.com/products/connector/ 2> //jdbc:[数据库类型]://[ip地址]:[端口号]/[数据库名] ...

  6. ACM题目————棋盘问题

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  7. cocos2dx资源和脚本加密quick-lua3.3final

    一.资源加密 版本号:Quick-Cocos2d-x 3.3 Final 调试工具:xCode 工程创建的时候选择的拷贝源码. 项目结构如图: 这个功能七月大神在很早之前就已经实现了,但是在3.3版本 ...

  8. jQuery.validator 详解

    jQuery.validator 详解二 前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示 ...

  9. jquery 判断checkbox是否为空的三种方法

    //方法一: if ($("#checkbox-id")get(0).checked) { // do something } //方法二:也适用于单选按钮 if($('#chec ...

  10. Poj(1466),最大独立集,匈牙利算法

    题目链接:http://poj.org/problem?id=1466 Girls and Boys Time Limit: 5000MS   Memory Limit: 10000K Total S ...