藍橋杯C 演算法訓練 最大最小公倍數

2021-10-20 22:33:10 字數 1220 閱讀 6061

問題描述

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

輸入格式

輸入乙個正整數n。

輸出格式

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

示例

輸入:9

輸出:504

資料規模與約定

1 <= n <= 106。

我對這個題目的理解是:

從區間[1,n]中取出任意的三個數,並求這三個數的最小公倍數,最後求出m種取數情況所得最小公倍數的最大值。

單從**的角度理解,首先想到的最暴力的方法是將所有情況的最小公倍數求出來,然後比較大小得到最終結果,但是這種方法的時間複雜度會很高,會達不到題目的資源限制要求,因此我們應該試著從題目的數學角度進行理解。

從數學角度來看,最終得到的結果是乙個最小公倍數,這就意味著這個結果是由三個互質的數相乘得到的。從計算方法看,選取的三個數越大,乘積越大;從所需的結果看,需要三個數互質。

因此,原問題就轉化為求區間[1,n]中最大且互質的三個數。此時,當n為奇數時,易知n,(n-1),(n-2)為最大且互質的三個數;當n為偶數時,由於(n-2)也為偶數,而再下乙個數是(n-3),存在n與(n-3)不互質的可能性,因此需要分n%3==0和n%3!=0兩種情況。

至此,分析完畢,**如下。

#include

using namespace std;

intmain()

else

else

else}}

cout

}

但是提交後**報錯,檢視輸出測試和輸入測試發現我變數定義的是int,而用於測試的數值比較大,造成了溢位。這裡將變數定義成long long型別就可以了。

改正後的**如下:

#include

using namespace std;

intmain()

else

else

else}}

cout

}

最終測試通過,以後注意看到資料規模與約定是「1 <= n <= 106」時,變數型別的定義吧。

藍橋杯 演算法訓練 最大最小公倍數

演算法訓練 最大最小公倍數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9 樣例輸出 504資料規模與約定 1 n 106。...

藍橋杯 演算法訓練 最大最小公倍數

問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。參考 當n為奇數時,答案一定是n n 1 n 2 當n為偶數時,答案是n a ...

藍橋杯 演算法訓練 最大最小公倍數

問題描述 已知乙個正整數n,問從1 n中任選出三個數,他們的最小公倍數最大可以為多少。輸入格式 輸入乙個正整數n。輸出格式 輸出乙個整數,表示你找到的最小公倍數。樣例輸入 9樣例輸出 504資料規模與約定 1 n 106。思路 首先,從題目的資料規模可以看出題目存在乙個特殊的情形,就是當n小於3的時...