1. 程式人生 > >藍橋杯--最大最小公倍數

藍橋杯--最大最小公倍數

問題描述

已知一個正整數N,問從1~N中任選出三個數,他們的最小公倍數最大可以為多少。

輸入格式

輸入一個正整數N。

輸出格式

輸出一個整數,表示你找到的最小公倍數。

樣例輸入

9

樣例輸出

504

資料規模與約定

1 <= N <= 106。

問題分析

本人lowb,一眼看題思路就是遍歷,先取N和N-1再從N到小找沒有公因子的最大數,最後相乘得結果

貼初始程式碼(劣質,可跳過

#include<cstdio> #include<cmath> using namespace std; const int Max=100010;  //函式記錄n以內質數  int sushu(int n,int *a)  {     a[0]=2;     int sum=1;//陣列中元素個數      for(int i=3;i<=n+1;i+=2)     {         int flag=0;         for(int j=0;j<sum;j++)             if(i%a[j]==0)             {                 flag=1;                 break;             }         if(!flag)             a[sum++]=i;         }      return sum; } int main() {     int n;     scanf("%d",&n);     int a[Max];     int len=sushu(sqrt(n),a);     if(n<=2)     {         printf("%d",n);         return 0;     }     long long x=n-1,y=n,temp;     for(int i=n-2;i>0;i--)//從大到小找      {         temp=i;         int flag=0;         for(int j=0;j<len;j++)             if((x%a[j]==0&&i%a[j]==0)||(y%a[j]==0&&i%a[j]==0))//判斷有無公因子              {                 flag=1;                 break;             }         if(!flag)             break;         }      printf("%lld",temp*x*y);     return 0;  }     

然鵝---

有些情況的資料會得錯誤結果

最後60分

留下了不學無術的眼淚

然後我借鑑了一下大佬們的思路

發現問題關鍵——>相鄰兩奇數為質數,再分N的奇偶結果就明瞭

分兩種情況:

       N為奇數時,結果最大就是N*(N-1)*(N-2).可自行思考判斷

       N為偶數時,1.不能整除3時,則為N*(N-1)(N-3)

                            2.N為3的倍數時,第三個數均不可取N-3,N-4(與N分別有3,2公因子)再往下為取N-5無論成不成立計算出                                  結果均小於(N-1)*(N-2)*(N-3)(N-1此時為奇數同上判斷)。所以此情況結果即(N-1)*(N-2)*(N-3)

新程式碼:

#include<cstdio>  using namespace std;   int main()  {     long long n,temp;     while(scanf("%lld",&n)==1)      {         if(n <= 2)             temp = n;             else if(n % 2)             temp = n * (n - 1) * (n - 2);         else          {             if(n%3)                  temp = n * (n-1) * (n-3);             else                  temp=(n-1) * (n-2) * (n-3);         }         printf("%lld\n",temp);      }     return 0; }

最後100分通過~~

通往成功的道路佈滿荊棘,但是勇往直前就一定會有收穫,懷挺!