蓝桥杯最大最小公倍数

  昨日刷题时碰到这题,发现自己的数学功底实在是差,也不知道3个月的刷题是否能将自己的水平拔高到一定水准,时间真是一个宝贵的东西。以下为题目:

    题目看完我的想法是这样的,从n开始遍历,判断是否互质,如果两两互质,那么用这3个数的乘积作为结果,代码如下,以下代码得了60分,并不正确:

 1 #include<stdio.h>
 2 #include<math.h>
 3 int f(int x,int y)
 4 {
 5     int i,j,min,max,flag=1;
 6     min=x>y?y:x;
 7     max=x<y?y:x;
 8     for(i=2;i<=sqrt(min);i++)
 9     {
10         if(x%i==0&&y%i==0)
11         {
12             flag=0;
13             break;
14         }
15     }
16     if(flag&&max%min!=0)
17         return 1;
18     else 
19         return 0;
20 }
21 int main(int argc, char *argv[])
22 {
23     long long x,i,j,k,n;
24     scanf("%d",&n);
25     if(n<5)
26     {
27         if(n==1)
28             printf("1");
29         else
30             printf("%d",n*(n-1));
31         return 0;
32     }
33     for(i=n;i>0;i--)
34         for(j=n-1;j>0;j--)
35             for(k=n-2;k>0;k--)
36                 if(f(i,j)&&f(i,k)&&f(j,k))
37                     {
38                         x=i*j*k;
39                         printf("%I64d",x);
40                         return 0;
41                     }
42 }

其中函数f是用来判断两数是否互质。

  在发现自己的代码并不正确之后,百度之。发现自己真的是too young too simple,sometimes naive!

  以下为思考后的总结:a,b这2个数的公因子只可能是<=abs(a-b);假设c为a,b的公因子,如果c>abs(a-b),那么min(a,b)=kc,因为(k+1)c>max(a,b),所以不存在公因子c>abs(a-b)。回到题目本身:如果n为奇数,那么n,n-1互质;n-1,n-2互质;n,n-2因为都是奇数,所以公因子2不成立,互质;当n为奇数时,最大最小公倍数为n(n-1)(n-2);当n为偶数时有2种情况:1、n%3!=0,最大最小公倍数为n(n-1)(n-3);2、n%3==0,最大最小公倍数为(n-1)(n-2)(n-3)。代码如下:

 1 #include<stdio.h>
 2 int main(int argc, char *argv[])
 3 {
 4     long long n,x;
 5     scanf("%I64d",&n);
 6     if (n<=2)
 7         x=n;
 8     else if(n%2)
 9         x=n*(n-1)*(n-2);
10     else
11     {    
12         if(n%3)
13             x=n*(n-1)*(n-3);
14         else
15             x=(n-1)*(n-2)*(n-3);
16     }
17     printf("%I64d",x);
18     return 0;
19 }

以上代码已过蓝桥杯测评系统。

原文地址:https://www.cnblogs.com/search-the-universe/p/search-the-universe-test1.html