zoukankan      html  css  js  c++  java
  • Factorials 阶乘(思维)

    Description

    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。

    Input

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

    Output

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

    Sample Input

    7
    

    Sample Output

    4


     解题思路:这道题思路倒是很简单,我们首先要知道N!的最后一位非零数是怎么得到的,我开始以为它是由1~N各项逐项相乘的最后一位非零数贡献得到的,所有开始遍历的时候对每次相乘得到的结果取最后一位非零数保存继承给下一次的相乘,一直循环下去,但是很不幸的是答案错误,后来我想到了这样一种情况,假设24*25,要是按照我之前的理解,答案是4*25 = 100,也就是1,但是24*25=600,答案应该是6!!!所以为了避免出现这种进位情况的出现,我们需要保存尽量多的后几位,这里最大是4220,所以对10000求余即可,存在后导零时消去。

     

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define ll long long int
     5 using namespace std;
     6 int main()
     7 {
     8     ll n,i;
     9     ll ans;
    10     ans=1;
    11     scanf("%lld",&n);
    12     for(i=1;i<=n;i++)
    13     {
    14        ans=ans*i;
    15        while(ans%10==0)
    16        {
    17            ans=ans/10;
    18        }
    19        if(ans>10000)
    20        {
    21            ans=ans%10000;
    22        }
    23     }
    24     ans=ans%10;
    25     printf("%lld
    ",ans);
    26     return 0;
    27 }
  • 相关阅读:
    SharePoint 2010 编程链接两个web part
    SharePoint 2010 Value does not fall within the expected range
    SharePoint 自定义开发chart web part
    跨站点显示SharePoint 列表或者文档库 cross site
    SharePoint Javascript 改变当前站点语言
    【转】 C++11中值得关注的几大变化
    XPM
    Thinking in C++ 第一章 对象导言
    Thinking in C++ 第4,5,6,7章
    Internal DSL
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9559161.html
Copyright © 2011-2022 走看看