Project Eular-71-Ordered fractions
阿新 • • 發佈:2019-01-10
描述
題解
看到這個題,想到有一個叫做 樹的東西,是專門用來拆分 所有真分數的,在《具體數學》上有講,但是書沒拿,也就能去仔細回顧一下了。
這個題只要答案,所以就算純暴力也是可以搞定的, 列舉判斷,不過這樣不太優雅,所以考慮可以降低到 ,因為我們要找小於 的最簡分數中最大的那個,也就是取最大的 ,所以我們可以列舉 ,然後令 ,這樣就可以保證是小於 ,然後取最大即可。
最後結果為 ,但是提交了很多次都是錯的,然後認識了一個單詞叫做 。
程式碼
#include <iostream>
using namespace std;
/*
* 428570/999997
* a/b 為 ans,初始 0/1
* 設 p/q < 3/7,則 7p < 3q
* 分母減小,7p < 3q - 1,則 p 最大為 floor((3q - 1) / 7)
* 列舉 q,取小於 3/7 的最大 p/q 給 a/b
*/
void solve(int x, int y, int &a, int &b, int d)
{
for (int q = 2; q <= d; q++)
{
int p = (int)((x * q - 1) / y);
if (a * q < b * p)
{
a = p;
b = q;
}
}
}
int main()
{
int a = 0, b = 1, d = 1000000;
int x = 3, y = 7;
solve(x, y, a, b, d);
printf("%d/%d\n" , a, b);
return 0;
}