博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO / Factorials (简单模拟)
阅读量:5301 次
发布时间:2019-06-14

本文共 1316 字,大约阅读时间需要 4 分钟。

USACO/Factorials

Factorials阶乘


N的阶乘写作N!,表示小于等于N的所有正整数的乘积。 阶乘会变大得很快,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。 你的任务是找到阶乘最后面的非零位。举个例子:
[]
描述

5!=1*2*3*4*5=120,所以5!的最后面的非零位是2。7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。

格式

PROGRAM NAME: fact4

INPUT FORMAT:

(fact4.in)

共一行,一个不大于4,220的正整数N

OUTPUT FORMAT:

(fact4.out)

共一行,输出N!最后面的非零位。

SAMPLE INPUT

7

SAMPLE OUTPUT

4
分析:
这道题太简单了= =……但是为什么还要写出来呢?显然是我SB的写错了。。。。。。
刚开始就是直接在每个阶段只留下最后一个不是零的数来去乘接下来的数,但是在WA+N次debug后终于发现,只留下一个数是不够的。。。因为也许这个数和下一个数乘起来末尾就成了零而不再适合了,比如本来是24,留下一个4,接下来是25,按这种方法做4*25,结果是100,最后一个非零为1,而实际上24*25=600,最后一个非零位是6。那么回到理论中,就是决定前面数字大小的数在上一阶段只留下最后一位数时被略去了而导致结果可能出错。。。所以。。。。。。一个贪心算法油然而生(= =这个词好诡异的用法。。。):不只留1位,尽可能多留~考虑到结果为int且n最大为5000,所以我们选择保留5位。。。
代码:
/*ID:138_3531LANG:C++TASK:fact4*/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int MAX(int a,int b){    return a>b?a:b;}int MIN(int a,int b){    return a>b?b:a;}ifstream fin("fact4.in");ofstream fout("fact4.out");int f(int n){    int k;    if (n==1)   return 1;    k=f(n-1)*n;    while (k%10==0)        k/=10;    return k%10000;}int main(){    int n;    fin>>n;    fout<
<

转载于:https://www.cnblogs.com/AbandonZHANG/archive/2012/07/16/2598261.html

你可能感兴趣的文章
day13.字典复习
查看>>
IPSP问题
查看>>
(转)Java中的String为什么是不可变的? -- String源码分析
查看>>
HNU 10362 A+B for Input-Output Practice (II)
查看>>
iOS——UIButton响应传参数
查看>>
【转帖】关于'eh vector constructor/destructor iterator'的讨论及类的内存分布模型
查看>>
十. 图形界面(GUI)设计9.列表和组合框
查看>>
10.17动手动脑
查看>>
操作系统实验一:并发程序设计
查看>>
互联网协议入门(一)
查看>>
16_Python变量作用域_Python编程之路
查看>>
js index of()用法
查看>>
XSS原理及防范
查看>>
WPF中Image显示本地图片
查看>>
SVN版本管理
查看>>
哈希表等概率情况下查找成功和查找不成功的平均查找长度的计算
查看>>
Windows Phone 7你不知道的8件事
查看>>
脚本删除文件下的文件
查看>>
实用拜占庭容错算法PBFT
查看>>
java b组 小计算器,简单计算器..
查看>>