如题,最后一位数好求,他只和最后一位相乘后的最后一位有关,唯一影响我们得是末尾0,而阶乘中末尾0来自于2和5,(10得话可以看成2 * 5),所以有这个思想我们可以筛选出1 * 2 * 3 * .... * n中包含2和5得个数

如下:

  1. int get2(int n)
  2. {
  3. if(n == 0)return 0;
  4. return n / 2 + get2(n / 2);
  5. }
  6. int get5(int n)
  7. {
  8. if(n == 0)return 0;
  9. return n / 5 + get5(n / 5);
  10. }

解释:

对于1 2 3 4 5 6 7 8 9 ^ 25 26 27 28 29 30
我要想找里面任何一个包含5得数字,一眼看去筛选出含有5得只有:5 10 15 20 25 30,但是有的含有两个5啊,那我就提出一个5,把他降一个形态,然后继续去寻找……
30 /5 = 6 得到原型 6!,其余得均为无关数,不必去管
继续筛选1 2 3 4 5 6,这个6得阶乘,是上面筛选完后产生得,可能还存在着得数,这些数将会递归进行二次筛选

这样我们完成了第一步,筛选完后,你会发现原来的阶乘

1 2 3 4 5 6 7 8 9 ^ 25 26 27 28 29 30

变成了

1 1 3 1 1 3 7 1 9 1 11 3 13 7 3

这样看反而有所不大直观,但是能够得出得就是最后剩下得就是1 3 7 9(尾数),1没有作用,而 3 7 9 结果观察,他们自身得n次方得位数有个周期

1 3 9 7

1 7 9 3

1 9 1 9

所以我们就可以取寻找原来那些数含有3,5,7得个数

还是先看看原型

1 2 3 4 5 6 7 8 9 ^ 25 26 27 28 29 30

step 1对于这些数,我们要做得是奇偶分开

1 3 5 7 9 。。。 2 4 6 8 10.。。。

对于偶数唯一要做得就是抽2变型(递归step1)

step2 对于奇数我们可以求取了,奇数中,每10个数中肯定含有1个3,7,9,所以返回得值中有n / 10然后对于非整得数,还要考虑其最后一位得大小选择性得+1 即+(n % 10 >= x)

然后奇数中还有5,这个根据我们得拆分,是不应该纯在得所以递归 step 2(n/ 5 --- 抽5降形)

为什么重复step2而不是step1呢?抽了5后不会出现偶数得情况吗??

因为 奇偶分家得时候,进来的奇数已经不再是一个完整得阶乘了,但是对3 7 9 得寻找毫无影响,因为偶数都一眼找不出来,所以进来得5 是 5 15 25,降型后也是 1 3 5 .。。直接去应用step2

到此就能够实现了

  1. int g(int n,int x)
  2. {
  3. if(n == 0)return 0;
  4. return n / 10 + (n % 10 >= x) + g(n / 5,x);
  5. //这里的5分解后只有奇数没有偶数ggm1,3,5,7....,然后再在奇数里筛选
  6. //因为10,20,这样的一开始再getx中是筛不进来得!!
  7. }
  8. int getx(int n,int x)//寻找这个数中
  9. {
  10. if(n == 0)return 0;
  11. return getx(n / 2,x) + g(n,x);
  12. }
  13. int numtable[4][4] ={
  14. 6,2,4,8,
  15. 1,3,9,7,//注意顺序得安排取0得时候代表有4个得时候得余数
  16. 1,7,9,3,
  17. 1,9,1,9
  18. };
  19. int main()
  20. {
  21. int n,m;
  22. while(~scanf("%d%d",&n,&m))
  23. {
  24. int num2 = get2(n) - get2(n-m);
  25. int num5 = get5(n) - get5(n-m);
  26. int num3 = getx(n,3) - getx(n-m,3);
  27. int num7 = getx(n,7) - getx(n-m,7);
  28. int num9 = getx(n,9) - getx(n-m,9);
  29. int res = 1;
  30. if(num5 > num2)
  31. {
  32. res = 5;
  33. }
  34. else if(num5 < num2)//WRONG 2 :只有不相等得时候才能乘法,因为numtable[0][0]也是有数据得肯定会造成影响
  35. {
  36. res *= numtable[0][(num2 - num5)%4];//WRONG 1 :乘上得是多余得2!!!
  37. res %= 10;
  38. }
  39. if(res != 5)
  40. {
  41. res *= numtable[1][num3%4];
  42. res %= 10;
  43. res *= numtable[2][num7%4];
  44. res %= 10;
  45. res *= numtable[3][num9%4];
  46. res %= 10;
  47. }
  48. printf("%d\n",res);
  49. }
  50. return 0;
  51. }

求n得阶乘得最后一位非零数字的更多相关文章

  1. 汇编语言-求X的阶乘

    1. 题目:求X的阶乘值 2. 要求:输入一个整型数(不超过10),求出其阶乘值后输出,求阶乘的算法用子程序来实现. 3. 提示:可以用递归来实现,也可以用简单的循环来实现. 这里使用循环来实现: 对 ...

  2. C语言-求1-20的阶乘的和(函数的递归)

    // //  main.c //  C语言 // //  Created by wanghy on 15/9/5. //  Copyright (c) 2015年 wanghy. All rights ...

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

    思路:举例求6的阶乘,6*5*4*3*2*1.可以将5开始看成另一个整型变量n,用一个循环每次将n的值减少1,.而递归也是如此,每次调用函数的时候将变量减一就可以. 方法一:非递归 //非递归: #i ...

  4. 求N的阶乘N!中末尾0的个数

    求N的阶乘N!中末尾0的个数 有道问题是这样的:给定一个正整数N,那么N的阶乘N!末尾中有多少个0呢?例如:N=10,N=3628800,则N!的末尾有两个0:直接上干货,算法思想如下:对于任意一个正 ...

  5. 大数问题:求n的阶乘

    题目:求100! 这看起来是一个非常简答的问题,递归解之毫无压力 int func(int n){ if(n <= 1) return 1; else return n*func(n-1); } ...

  6. 2717: 递归函数求n的阶乘

    2717: 递归函数求n的阶乘 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1329  Solved: 942[Submit][Status][Web ...

  7. 求n的阶乘!

    编写一个computer类,类中含有一个求n的阶乘的方法,将该类打包, 在另一个包中引入包,在主类中定义computer类的对象,调用求n的阶乘的方法,并输出结果 结果

  8. 题目一:编写一个类Computer,类中含有一个求n的阶乘的方法

    作业:编写一个类Computer,类中含有一个求n的阶乘的方法.将该类打包,并在另一包中的Java文件App.java中引入包,在主类中定义Computer类的对象,调用求n的阶乘的方法(n值由参数决 ...

  9. POJ 1401:Factorial 求一个数阶乘的末尾0的个数

    Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submissions: 15137   Accepted: 9349 Descri ...

随机推荐

  1. oracle 单表导出导入

    exp username/password@服务名 file=d:\daochu.dmp tables=(tableneme,...)

  2. dpdk中文文档

    Linux平台上DPDK入门指南 1. 简介 1.1. 文档地图 2. 系统要求 2.1. X86 上预先设置 BIOS 2.2. 编译DPDK 2.3. 运行DPDK应用程序 3. 使用源码编译DP ...

  3. html 转化成 pdf

  4. Java Http接收中文乱码解决

    当时url传递时,可用 byte[] bytes=reqdata_s.getBytes("ISO-8859-1"); String name=new String(bytes,&q ...

  5. com_pc-mcu

    #include <REG52.H> unsigned char UART_buff; bit New_rec = , Send_ed = , Money = ; void main (v ...

  6. Null value was assigned to a property of primitive type setter of cn.itcast.oa.domain.Forum.topicCount

    [引用http://m.blog.csdn.net/blog/u013998070/41087351] Null value was assigned to a property of primiti ...

  7. Mysql 常用增删改查命令集合教程

    创建:create      插入:insert 更新:update  查询:select 删除:delete 修改:alter     销毁:drop 创建一个数据库: create databas ...

  8. Linux学习笔记:Jenkins安装

    操作系统是CentOS 7,安装Jenkins 首先安装jdk,可在Oracle jdk和Openjdk中任选其一安装Oracle jdk步骤见:   https://www.cnblogs.com/ ...

  9. JS closure

    闭包的概念 闭包,不同于一般的函数,它允许一个函数在立即词法作用域外调用时,仍可访问非本地变量. --维基百科 闭包就是能够读取其他函数内部变量的函数. --阮一峰 由于在Javascript语言中, ...

  10. spring学习 十七 scope属性,单例多例

    Scope属性是<bean>中的属性,取值可以有, singleton 默认值, 单例, prototype 多例, 每次获取重新实例化, request 每次请求重新实例化, sessi ...