藍橋杯--最大最小公倍數
問題描述
已知一個正整數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分通過~~
通往成功的道路佈滿荊棘,但是勇往直前就一定會有收穫,懷挺!