昨日刷题时碰到这题,发现自己的数学功底实在是差,也不知道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 }
以上代码已过蓝桥杯测评系统。