uva 10077 - The Stern-Brocot Number System

想法:
  初始化三個數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("\n"); 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("\n");
 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 }

 

posted @ 2016-01-27 14:30  小小泽  阅读(393)  评论(0编辑  收藏  举报