zoukankan      html  css  js  c++  java
  • 阶乘问题

    问题 F: 

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 44  解决: 38
    [提交][状态][讨论版]

    题目描述

    也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
        12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001,600
    12的阶乘最右边的非零位为6。
        写一个程序,计算N(1<=N<=50,000,000)阶乘的最右边的非零位的值。
    注意:10,000,000!有2499999个零。

    输入

    仅一行包含一个正整数N。

    输出

    单独一行包含一个整数表示最右边的非零位的值。

    样例输入

    12
    

    样例输出

    6


    解题思路:额,写的代码有点长,但思路很好理解。
      题目要求最多计算到50,000,000的阶乘,最后得到的结果肯定大的不行了。
      但求的是结果最右边的非零值,那么每次相乘的时候只有最后一位对结果有影响,高位不会影响低位的。
      所以每次取数的最后一位,按说计算50,000,000次是有点慢的,应该会超时,但我提交竟然AC了。
    代码:
    #include <iostream>
    #include <cstdio>
     
    using namespace std;
     
    int main()
    {
        int n;
        int f=1;
        int b;
        int a1=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            b=i;
            a1=0;
            while(a1==0){
                if(b==10){
                    a1=1;
                    break;
                }
                if(b==20){
                    a1=2;
                    break;
                }
                if(b==30){
                    a1=3;
                    break;
                }
                if(b==40){
                    a1=4;
                    break;
                }
                if(b==50){
                    a1=5;
                    break;
                }
                if(b==60){
                    a1=6;
                    break;
                }
                if(b==70){
                    a1=7;
                    break;
                }
                if(b==80){
                    a1=8;
                    break;
                }
                if(b==90){
                    a1=9;
                    break;
                }
                a1=b%10;
                b/=10;
            }
            f=f*a1;
            b=f;
            a1=0;
            while(a1==0){
                if(b==10){
                    a1=1;
                    break;
                }
                if(b==20){
                    a1=2;
                    break;
                }
                if(b==30){
                    a1=3;
                    break;
                }
                if(b==40){
                    a1=4;
                    break;
                }
                if(b==50){
                    a1=5;
                    break;
                }
                if(b==60){
                    a1=6;
                    break;
                }
                if(b==70){
                    a1=7;
                    break;
                }
                if(b==80){
                    a1=8;
                    break;
                }
                if(b==90){
                    a1=9;
                    break;
                }
                a1=b%10;
                b/=10;
            }
            f=a1;
        }
     
        printf("%d",f);
        return 0;
    }
     
    /**************************************************************
        Problem: 1821
        User: zz13
        Language: C++
        Result: 正确
        Time:0 ms
        Memory:1696 kb
    ****************************************************************/
     
  • 相关阅读:
    Android周学习Step By Step(6)Android的数据库SQLite
    Android周学习Step By Step(2)HelloWorld
    解决方案(.sln)文件
    浅谈测试(1)单元测试
    批量上传功能的实现
    分页控件AspNetPager的用法
    .net下验证码的简单实现
    window.alert重写实现友好的对话框(支持IE)
    网页上自定义运行和测试HTML脚本
    数据库行转列的sql语句(zt)
  • 原文地址:https://www.cnblogs.com/TWS-YIFEI/p/5752196.html
Copyright © 2011-2022 走看看