zoukankan      html  css  js  c++  java
  • 先思考,后动手。

    题目是这样的

    Holidays have finished. Thanks to the help of the hacker Leha, Noora managed to enter the university of her dreams which is located in a town Pavlopolis. It's well known that universities provide students with dormitory for the period of university studies. Consequently Noora had to leave Vičkopolis and move to Pavlopolis. Thus Leha was left completely alone in a quiet town Vičkopolis. He almost even fell into a depression from boredom!

    Leha came up with a task for himself to relax a little. He chooses two integers Aand B and then calculates the greatest common divisor of integers "A factorial" and "B factorial". Formally the hacker wants to find out GCD(A!, B!). It's well known that the factorial of an integer x is a product of all positive integers less than or equal to x. Thus x! = 1·2·3·...·(x - 1)·x. For example 4! = 1·2·3·4 = 24. Recall that GCD(x, y) is the largest positive integer q that divides (without a remainder) both x and y.

    Leha has learned how to solve this task very effective. You are able to cope with it not worse, aren't you?

    Input

    The first and single line contains two integers A and B (1 ≤ A, B ≤ 109, min(A, B) ≤ 12).

    Output

    Print a single integer denoting the greatest common divisor of integers A! and B!.

    Example

    Input
    4 3
    Output
    6

    Note

    Consider the sample.

    4! = 1·2·3·4 = 24. 3! = 1·2·3 = 6. The greatest common divisor of integers 24 and 6is exactly 6

    看到题目的第一眼我觉得这题目思路清晰 不难

    我首先的源代码是

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
    int jc(int a0);
    int gys(int a1,int b1);
    int a,b;
    while(cin>>a>>b){
    cout<<gys(jc(a),jc(b));}
    }
    int jc(int a0)/*按题目思路先求阶乘*/
    {
    int k;
    if(a0==1)k=a0;
    else k=a0*jc(a0-1);
    return k;
    }
    int gys(int a1,int b1)/*然后求最大公约数*/
    {
    int q;
    for(int k=1;k<=min(a1,b1);k++)
    {
    if(a1%k==0&&b1%k==0)q=k;
    }
    return q;
    }

    可是在错了四次之后 我就觉得不对劲了 

    经过理性思考以后终于发现了原因:如果我按首先的源码的话,当输入比较大的话(例如1000)就会超出内存,所以就只能从求阶乘入手了,题意是要我们求a!,b!的最大公约数c(a>b),a!,b!存在关系a!/b!=a*(a-1)*(a-2).......*b所以a!与b!的最大公约数其实就是b!,所以我们其实只要求输入中较小数b的阶乘b!,这是改进后的源代码

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
    int a,b,k=1;
    cin>>a>>b;
    for(int i=1;i<=min(a,b);i++)
    {
    k*=i;
    }
    cout<<k<<endl;
    }

    是不是简单了很多,以后看题目还是得先多多思考,不然会浪费好多时间(ง •_•)ง!!!

  • 相关阅读:
    [官网]CREATE EXTENSION PostGreSQL 创建函数的方法
    Notepad++的一个用法 转换为unix 格式的文件
    LLVM的安装
    Linux 下面RPM 安装的SQLSERVER 修改字符集的方法
    Linux 下面 Sqlserver 2017 的简单安装
    Linux下面将windows写的脚本转换成 Linux 格式的文件
    PostgreSQL 安装了contrib 之后 登录失败的问题
    Linux 下面 PG 的 uuid-ossp 包安装办法
    Chrome 离线安装插件的办法
    [新三板摘牌]国资企业济南华光光电去年终止拟IPO今年摘牌新三板
  • 原文地址:https://www.cnblogs.com/miaos/p/miaoz-1-1.html
Copyright © 2011-2022 走看看