牛客小白月赛5 【H I D

链接:https://www.nowcoder.com/acm/contest/135/H
来源:牛客网
 

H 最大公约数

题目描述

给定两个正整数a,b,求a,b的最小公倍数。(即[a,b])

输入描述:

两个整整数,a,b

输出描述:

一个正整数,表示[a,b]
#include "bits/stdc++.h"
using namespace std;

unsigned long long gcd(unsigned long long a,unsigned long long b){
return b==0?a:gcd(b,a%b);

}

int main(){
    unsigned long long a,b,t,g;
    while(cin>>a>>b){
    t=gcd(a,b);
    g=a/t*b/t*t;
    cout<<g<<endl;
    }
    return 0;

}

链接:https://www.nowcoder.com/acm/contest/135/J
来源:牛客网
 

j-时间

题目描述

         Apojacsleam是一个喜欢特殊时刻的人。

      他定义了一个时刻,若电子表显示ab:ba(24小时制),则该时刻为“回文时刻”(可以有前导零)。例如00:00就是回文时刻。

        给定一个时刻,求此时刻的上一个和下一个回文时刻。

J题附加:00:00就是24:00,没有24:00这一时刻

J题附加:输入可能有前导0,输出不含前导0,例如10:1的意思是10:01,而10:10的输出为10:10 

输入描述:

两个正整数,用“:”隔开,表示小时和分钟,保证输入时间合法。

输出描述:

两行,两个时刻(不含前导0),用“:”隔开,表示上一个时刻和下一个时刻

暴力枚举(?!),其实我觉得函数time1可以用一个for循环解决,但是比赛的时候思路很乱,就用了暴力的方法,这题只要注意边界问题就很容易过了 

#include "bits/stdc++.h"
using namespace std;

struct node{
int x,y;
}timee[24];


void time1(){
        timee[0].x=0;timee[0].y=0;
        timee[1].x=1;timee[1].y=10;
        timee[2].x=2;timee[2].y=20;
        timee[3].x=3;timee[3].y=30;
        timee[4].x=4;timee[4].y=40;
        timee[5].x=5;timee[5].y=50;
        timee[10].x=10;timee[10].y=1;
        timee[11].x=11;timee[11].y=11;
        timee[12].x=12;timee[12].y=21;
        timee[13].x=13;timee[13].y=31;
        timee[14].x=14;timee[14].y=41;
        timee[15].x=15;timee[15].y=51;
        timee[20].x=20;timee[20].y=2;
        timee[21].x=21;timee[21].y=12;
        timee[22].x=22;timee[22].y=22;
        timee[23].x=23;timee[23].y=32;
        timee[24].x=24;timee[24].y=42;

}

int main(){
    int a,b;
    memset(timee,-1,sizeof(timee));
    time1();
    while(scanf("%d:%d",&a,&b)!=EOF){
    for(int i=a;i>=0;i--){
if(timee[i].x==-1)
            continue;
            if(a==0&&b==0){
                cout<<"23:32"<<endl;
                break;
            }
        if((a==timee[i].x&&b>timee[i].y)||a>timee[i].x){
            cout<<timee[i].x<<":"<<timee[i].y<<endl;
            break;
        }
    }
    for(int i=a;i<=24;i++){
        if(timee[i].x==0)
            continue;
        if((a==timee[i].x&&b<timee[i].y)||a<timee[i].x){
                if(timee[i].x==24){
                    cout<<"0:0"<<endl;
                    break;
                }
            cout<<timee[i].x<<":"<<timee[i].y<<endl;
            break;
        }
    }
    }
    return  0;

}

链接:https://www.nowcoder.com/acm/contest/135/D
来源:牛客网
 

D-阶乘

题目描述

输入描述:

输入数据共一行,一个正整数n,意义如“问题描述”。

输出描述:

输出一行描述答案:

一个正整数k,表示S的末尾有k个0

阶乘计算之大数阶乘与快速取模阶乘计算

引例之速求阶乘末尾0的个数

https://blog.csdn.net/deaidai/article/details/79253753

我们知道末尾0至于阶乘中的因子2*5有关,并且阶乘n中5的数量比2的数量少很多。
如果我们要考虑阶乘尾数0的个数,就只要知道有多少个2*5即可,只要知道5的个数即可。
所以我们只要算出N!中5的个数。
而N!中5的个数公式=n/5+n/25+n/125…n/(5^m)
举个例子。n=1000。
1-1000中5有a1=200。
1-1000有25有a2=40。
1-1000有125有a3=8。
1-1000有625有a4=1。
所以5的个数有5+25+125+625。为什么直接加?因为如1-1000中的数75,它有2个5。他在a1中算过一次,在a2中也算过一次。
so。实现代码如下。

#include <bits/stdc++.h>
using namespace std;
//n![1~10]:1,2,6,24,120,720,5040,40320,362880,3628800,
int main()
{
    int n;
    cin>>n;
    int ans=0;
    while(n){
        ans+=n/5;
        n/=5;
    }
    cout<<ans<<endl;
    return 0;
}

但是用上面这个方法会超时,稍微修改了一下。 / / 阶乘之间相乘,0的个数直接加在后面,所以相乘的阶乘之间0的个数直接相加

下面是ac代码: 

#include "bits/stdc++.h"
using namespace std;
int main(){
    int n;
    long long ans=0,sum=0;
    while(cin>>n){
            sum=0;
        for(int i=5;i<=n;i++){
            int t=i;
            while(t%5==0){
                ans++;
                t/=5;
            }
        sum=sum+ans;
    }

        cout<<sum<<endl;
    }
    return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章