想法:
初始化三個數L=0/1, M=1/1, R=1/0,設輸入的分數為a:
- 如果a<M,那麼要往左邊走,
R = M;
M = (L分子+M分子)/(L分母+M分母); - 如果a>M,往右邊走,
L = M;
M = (R分子+M分子)/(R分母+M分母); - 如果a==M,停止。
這題和二分搜尋很類似。迭代算法如下:
1 #include <cstdio> 2 using namespace std; 3 struct fraction{ 4 int M; // Molecular 分子 5 int D; // Denominator 分母 6 }; 7 int main() 8 { 9 int m, n; 10 while(scanf("%d%d", &m, &n)) 11 { 12 if(m == 1 && n == 1) break; 13 fraction L = {0, 1}, M = {1, 1}, R = {1, 0}; 14 15 while(1){ 16 long double t1 = (long double) m / n, t2 = (long double)M.M / M.D; 17 if(t1 < t2) { 18 printf("L"); 19 R = M; 20 M.M += L.M; 21 M.D += L.D; 22 } 23 else if(t1 > t2) { 24 printf("R"); 25 L = M; 26 M.M += R.M; 27 M.D += R.D; 28 } 29 else { printf(" "); break;} 30 } 31 } 32 return 0; 33 }
递归算法如下:
题目:给你一颗分数组成的二叉树,初始值是1/1,两边的边界分别是0/1与1/0,然后递归建立子树节点,
每个子树的节点值为两边的边界值得分子之和比上分母之和,新的值也加入边界值。
分析:递归,数据结构。看到上面的描述就可以做了吧,直接递归。
tree(L, R, key) {
if(add(L+R)= key)return;
if(add(L+R)< key){
cout << "R";
tree(L,add(L,R),key);
}else {
cout << "L";
tree(add(L,R),R,key);
}
}
说明:强大的递归╮(╯▽╰)╭。
1 #include <iostream> 2 using namespace std; 3 4 void tree(int Lx, int Ly, int Rx, int Ry, int Tx, int Ty) 5 { 6 if (Lx+Rx == Tx && Ly+Ry == Ty) { 7 printf(" "); 8 return; 9 } 10 if ((Lx+Rx)*Ty < (Ly+Ry)*Tx) { 11 printf("R"); 12 tree(Lx+Rx, Ly+Ry, Rx, Ry, Tx, Ty); 13 }else { 14 printf("L"); 15 tree(Lx, Ly, Lx+Rx, Ly+Ry, Tx, Ty); 16 } 17 } 18 19 int main() 20 { 21 int n,m; 22 while (cin >> m >> n && !(m == 1 && n == 1)) 23 tree(0, 1, 1, 0, m, n); 24 return 0; 25 }