zoukankan      html  css  js  c++  java
  • uva 10077

    想法:
      初始化三個數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 }
  • 相关阅读:
    模板方法模式
    备忘录模式
    观察者模式
    中介者模式
    迭代器模式
    Char型和string型字符串比较整理
    命令模式
    责任链模式
    代理模式
    dokcer 杂谈
  • 原文地址:https://www.cnblogs.com/aze-003/p/5163140.html
Copyright © 2011-2022 走看看