链接: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;
}