問題描述分析與解已知乙個正整數n,問從1~n中任選出三個數,他們的最小公倍數最大可以為多少。
輸入格式
輸入乙個正整數n。
輸出格式
輸出乙個整數,表示你找到的最小公倍數。
樣例輸入
9樣例輸出
504資料規模與約定
1 <= n <= 106。
首先,對題目所給資訊進行分析:
1、分析資料結構方面
題目給出的資訊,是求最大的最小公倍數,那麼就要按照盡可能大的結果,來考慮儲存時所要用到的資料結構。
先考慮輸入的資料n,因為他的範圍是1~10的6次方,在int的表示範圍之內,所以採用int來儲存n即可。
其次,,n的最大值是10^6,那麼最大的最小公倍數應該在10的18次方左右,所以不能直接儲存(因為long long 型的資料也儲存不下),所以採用陣列儲存最終的 最大最小公倍數。
由於採用陣列儲存最終值,勢必要用到模餘運算,那麼最終值儲存與輸出時可能會存在偏差----非最高位時,每個陣列元素單元的數,要按照規定的位數輸出---->存在要考慮補 0 的情況。為了方便實現,我把這個輸出模組,用乙個單獨的輸出函式來實現:
int
print
(int k)
//可能需要補0的情況
printf
("%d"
,a[k]);
for(i=k-
1;i>=
1;i--)}
}return0;
}
因為要求的是最大的 最小公倍數,所以3個數一定不能隨意尋找。要保證其最小公倍數的值最大,用來求公倍數的每個數都要盡可能的大,要具體的分情況討論:
a、最大的數----即n是奇數時,因為相鄰的奇數的最大公約數均為1,那麼可以選取n、n-1、n-2,這3個數求最小公倍數,所得結果即為所求值
b、最大數----即n是偶數時,初步考慮,所選用的數應該是n、n-1、n-3,(因為n-2偶數)。
但是,仔細分析會發現,可能出現意外情況。例如,n和n-3是相差,如果n為3的倍數,那麼n-3也會是3 的倍數,這時候用n、n-1、n-3,就得不到最大得最小公倍數。
所以應該將n是偶數時候的情況,再進行分情況討論:
①n不是3的倍數時,這個時候,n、n-1、n-3這3個數的乘積,就是所求的就是最大的最小公倍數
②n是3的倍數時,這時候,應該果斷捨棄n,將最大的數選取位n-1,那麼就回歸到了最大數是奇數的情況,所得的最終乘積,才符合「最大的最小公倍數」
源**如下(藍橋杯測試通過):
#include
int a[10]
;//int k;//記錄儲存在a中的值,所佔的最大的陣列元素的下標值
intcount
(int n,
int m,
int k,
int flag)
for(j=n;j>=m;j--)if
(cf!=0)
//存在進製
}return k;
}int
print
(int k)
//可能需要補0的情況
printf
("%d"
,a[k]);
for(i=k-
1;i>=
1;i--)}
}return0;
}int
multiple
(int n)
else
//偶數
else
//是3的倍數
}print
(k);
//呼叫函式實現輸出
return0;
}int
main()
補充:其實,我覺得這道題目用到的不是貪心的思想,而是動態規劃的思想。因為如果輸入的n是偶數,又是3的倍數的情況下,最終所選取的3個數中,就沒有選擇n,而是選擇了n-1,這明顯是動態規劃的解題思路。如有不妥,請指教! 藍橋杯 演算法訓練 最大最小公倍數
演算法訓練 最大最小公倍數 時間限制 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的時...