南阳理工学院的新生交流题目
思路
先查询n,m之间素数个数,若个数为素数,则输出n,m的最小公倍数,否则输出n,m的最大公约数。
数据范围不大,从min(n,m)到max(n,m)一路遍历,统计素数个数,再判断素数的个数是否为素数,若是,输出(n,m)最小公倍数,否则输出(n,m)的最大公约数。
#include<iostream>
#include<string.h>
#include<matn.h>
int gcd(int a,int b)
{
int t;
while(b!=0)
{
t=a;
a=b;
b=t%a;
}
return a;
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int judge(int a)
{
int i;
for(i=2;i<sqrt(a);i++)
{
if(a%i==0)
{
return 0;
}
}
if(a==0||a==1)
{
return 0;
}
return 1;
}
int main()
{
int nn;
scanf("%d%d",&nn);
while(nn--)
{
int n,m,prime=0,temp;
scanf("%d%d",&n,&m);
if(n<m)
{
temp=n;
n=m;
m=temp;
}
for(i=n;i<=m;i++)
{
if(judge(i))
{
prime++;
}
}
if(judge(prime))
{
printf("%d
",lcm(n,m));
}
else{
printf("%d
",gcd(n,m));
}
}
}