2014第五次上机解题报告
--------by14211065于济凡
写在前面:
上机题目有时候是长时间的训练,有时候是一瞬间的灵感,所以,不用过于在意结果,毕竟,我们的目的都在于增长自己的能力,都在于成长。
第一题:jhljx学gcd
ProblemDescription
大家都知道gcd是最大公约数的意思。jhljx准备开始学习gcd了。他想要求出n个数的最大公约数gcd和最小公倍数lcm。请你帮帮他。
Input
输入多组数据。
每组数据两行,第一行为一个正整数n,表示有多少个数(2<=n<=20)。
第二行有n个正整数,每个数之间用空格隔开。
Output
输出这n个数共同的最大公约数和最小公倍数(保证结果在int范围内)。
SampleInput
2
9 15
3
24 60 18
SampleOutput
345
6 360
如果只是单纯地比较和计算两个数之间的最大公约数和最小公倍数,那对于已经学习了函数和递归的同学们来说并不是什么难题,但是计算多个数的最大公约数和最小公倍数可能对于一些同学就有些难度了,那我们不妨现在先来复习下三个最大公约数和最小公倍数的求法。
比如:24,60,18
求最大公约数可以采取先求24与60的最大公约数,然后再求这个公约数12与18的最大公约数,得到6
求最小公倍数可以采取先求24与60的最小公倍数120,再求120与18的最小公倍数,得到180.
由此可见:我们求多个数的最大公约数与最小公倍数时,可以采用先求前两个数的最大公约数,再不断用这个数的公约数与下一个数求公约数,直到结束,最小公倍数同理。
于是,代码如下:
#include<iostream>
using namespace std;
int gcd(int m,int n)
{
int r;
r=m%n;
if(r==0)
return n;
else
return gcd(n,r);
}
int lcm(int p,int q)
{
return p*q/gcd(p,q);
}
int main()
{
int counter;
int x,y,z,x1,y1,z1;
int gcdx,lcmx;
while(cin>>counter)
{
cin>>x>>y;
x1=x;
y1=y;
gcdx=gcd(x,y);
lcmx=lcm(x1,y1);
for;counter>=3;counter--)
{
cin>>y;
y1=y;
x=gcdx;
gcdx=gcd(x,y);
x1=lcmx;
lcmx=lcm(x1,y1);
}
cout<<gcdx<<" "<<lcmx<<endl;
}
}
第二题:jhljx学素数
ProblemDescription
函数是一个重要的知识点。jhljx一改丧心病狂的风格,来点小清新。
他让你用函数实现判断一个数是否为素数。
Input
输入多组数据。
输入一个非负整数n。(保证n在long long范围内,但不会很大)
Output
如果这个数是素数,输出"jhljx isgood!",否则输出"jhljxis sangxinbingkuang!"。
SampleInput
1
2
SampleOutput
jhljxis sangxinbingkuang!
jhljx is good!
Hint
本题会检查代码,不用函数实现的一律0分。
本题是课本原题,见课本214页6.29
首先,这道题的确是书后的原题,第二呢,没做也没关系,毕竟我们的第一次练习赛也曾经做过类似的素数判断(2014级第一次练习E)。
不过这个题目还有一点,那就是要求用函数实现
那么具体如何实现呢?
判断一个数n是不是素数,只需要判断从1开始,一直到根号下n,只要没有除了1之外的数能够被整除即可(为什么不是一直到n呢?因为怕超时间)
所以规避了超时的陷阱之后,这道题可能就基本做出来了。
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int sushu(long long x)