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

题目描述
定义 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。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include<math.h>
 4 using namespace std;
 5 
 6 int gcd(int a,int b)//求最大公约数
 7 {
 8     if(a==0)
 9         return b;
10     int c;
11     while(b)
12     {
13         c=b;
14         b=a%b;
15         a=c;
16     }
17     return a;
18 }
19 int main()
20 {
21    int t;
22     scanf("%d",&t);
23     while(t--)
24     {
25         int n;
26         scanf("%d",&n);
27         if(n==2)
28         {
29             printf("NO
");continue;//特殊情况
30         }
31         int temp=sqrt(n),p,falg=0;
32         for(int i=2;i<=temp;i++)//遍历所有的因子对
33             if(n%i==0)
34             {
35                 p=n/i;
36                 if(gcd(p,i)==1)//判断是否互质
37                 {
38                     falg=1;
39                     break;
40                 }
41             }
42 
43         if(falg)
44             printf("YES
");
45         else
46             printf("NO
");
47     }
48     return 0;
49 }
正解代码
原文地址:https://www.cnblogs.com/vivider/p/3650602.html