您的位置:首页 > 其它

哈理工OJ-1328 相等的最小公倍数

2014-04-07 20:09 302 查看
题目描述
定义 An 为 1,2,…,n 的最小公倍数,例如,A1=1,A2=2,A3=6,A4=12,5=60,A6=60。
请你判断对于给出的任意整数 n,An 是否等于 An–1。如果 An 等于An-1则输出 YES 否则输出 NO。

分析
由最小公倍数的定义我们可以知道,如果 An=An-1 则 An-1 可以被 n 整除,首先,对于一个数 n 如果是素数,那么 An 不等于 An-1,其次,我们分析 n,如果对于小于 n 的每一对因子即 n=a*b(a<n 且 b<n),如果 a,b 不互素,那么 gcd(a,b)>1,则 lcm(a,b)=n/gcd(a,b)<n(lcm表示最小公倍数),那么很显然,如果 n 的每一对因子都是不互素的,则 n 不能整除 An-1,否则可以整除 An-1,因为 n 的因子肯定小于等于 n-1,所以其每一对因子的最小公倍数肯定可以整除 An-1,所以这道题就 0 变成了判断 n 是否有互素的一对因子,所以我们只要枚举 n的每一对因子,然后计算其最大公约数是否为 1,如果有一对互素的因子则输出 YES,否则输出 NO。

#include <iostream>
#include <stdio.h>
#include<math.h>
using namespace std;

int gcd(int a,int b)//求最大公约数
{
if(a==0)
return b;
int c;
while(b)
{
c=b;
b=a%b;
a=c;
}
return a;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==2)
{
printf("NO\n");continue;//特殊情况
}
int temp=sqrt(n),p,falg=0;
for(int i=2;i<=temp;i++)//遍历所有的因子对
if(n%i==0)
{
p=n/i;
if(gcd(p,i)==1)//判断是否互质
{
falg=1;
break;
}
}

if(falg)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}


正解代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: