A Rational Sequence

题目描述

An infinite full binary tree labeled by positive rational numbers is defi ned by:
• The label of the root is 1/1.
• The left child of label p/q is p/(p+q).
• The right child ofl abel p/q is (p+q)/q.
The top of the tree is shown in the following figure:

A rational sequence is defined by doing a level order (breadth first) traversal of the tree (indicated by the light dashed line). So that:
F(1) = 1/1, F(2) = 1/2, F(3) = 2/1, F(4) = 1/3, F(5) = 3/2, F(6) = 2/3, . . .
Write a program which takes as input a rational number, p/q, in lowest terms and fi nds the next rational number in the sequence. That is, if F(n) = p/q, then the result is F(n + 1).

 

输入

The first line of input contains a single integer P, (1 ≤ P ≤ 1000), which is the number of data sets that follow. Each data set should be processed identically and independently.
Each data set consists of a single line of input. It contains the data set number, K, which is then followed by a space, then the numerator of the fraction, p, followed immediately by a fonward slash (/),followed immediately by the denominator of the fraction, q. Both p and q will be relatively prime and 0 ≤ p, q ≤ 2147483647.

 

输出

For each data set there is a single line of output. It contains the data set number, K, followed by a single space which is then followed by the numerator of the fraction, followed immediately by a forward slash (‘/’) followed immediately by the denominator of the fraction. Inputs will be chosen such that neither the numerator nor the denominator will overfl ow a 32-bit integer.

 

样例输入

5
1 1/1
2 1/3
3 5/2
4 2178309/1346269
5 1/10000000
 

样例输出

1 1/2
2 3/2
3 2/5
4 1346269/1860498
5 10000000/9999999

找规律得出只要p<q,下一个一定为q/q-p;反之,则有往上找层数与他们的关系

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <string>
#define ull unsigned long long
using namespace std;
typedef  long long ll;
int main()
{
    ll t,n,a,b;
    scanf("%d",&t);
    for(int x=0;x<t;x++)
    {
        scanf("%lld %lld/%lld",&n,&a,&b);
        if(a==b)
        {
            printf("%lld 1/2\n",n);
            continue;
        }
        if(b==1)
        {
            printf("%lld 1/%lld\n",n,a+b);
            continue;
        }
        if(b>a)
        {
            printf("%lld %lld/%lld\n",n,b,b-a);
            continue;
        }
        else
        {
            if(b==2)
            {
                printf("%lld %lld/%lld\n",n,b,a);
                continue;
            }
 
                ll tp=0;
                tp=a/b;
                a=a%b;
                ll temp=a;
                a=b;
                b=b-temp;
                b=a*tp+b;
                printf("%lld %lld/%lld\n",n,a,b);
 
        }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值