【Java】Wilf tree 寻找所有在给定整数范围内的有理数

oj|有理数树(1338)(绝对正确) 接着他们一列一列地产生这棵树,当他们要产生第k+1列的时候,就先把前k列所有的分数按照大小排成一列(假设有n个),在这些数之间会有n - 1个间隔,那么第k + 1列就准备产生n - 1个数,其值的分子恰好是左右两个数的分子的和、分母是左右两个数的分母的和。从这棵树中,我们可以看出,每个正的最简分数在这棵树中恰好出现一次,我们用字母“L”和“R”分别表示从树根(1 / 1)开始的一步“往左走”和“往右走”,则每一个数都可以由L和R组成的序列表示。一行两个互素的正整数m和n(1 ≤ n,m ≤1000)。 阅读详情

Wilf tree的结构类似二叉树,每个节点的数字能从其父节点推导而得,是用于求得所有在给定整数范围内的有理数的一种方法。其结构如下图所示,根节点为1,根节点即为该树的第一层,若给定整数为N,则1-N层所有节点即为N内的所有有理数。


父节点与子节点的关系:

设父节点的分子为i,分母为j,则左子节点为(i/(i+j)),右节点为(i+(i+j)/j),若还不能理解请参考维基百科:https://en.wikipedia.org/wiki/Calkin%E2%80%93Wilf_tree,有动画进行说明。

用Java进行实现,其实过程很简单,即去搜寻每个节点的两个子节点,将子节点都放入集合后再将父节点标记为访问过的节点,当父节点所在层数为给定整数N,停止往下计算。当所有节点都被标记为已访问,程序结束。

节点类:

/**
 * 有理数结点类
 */
public class RationalNumber {
    private int num1;
    private int num2;
    private boolean flag = false;
    int layer;
    public void setNum1(int num1){
        this.num1 = num1;
    }
    public void setNum2(int num2){
        this.num2 = num2;
    }
    public void setFlag(boolean flag){
        this.flag = flag;
    }
    public void setLayer(int layer){
        this.layer = layer;
    }
    public int getNum1(){
        return num1;
    }
    public int getNum2(){
        return num2;
    }
    public boolean isFlag(){
        return flag;
    }
    public int getLayer(){
        return layer;
    }
}
import java.util.ArrayList;
import java.util.Scanner;

/**
 * 利用Wilf tree列出所有在给定整数内的有理数
 */

public class FindRationalNumber {
    public static void main(String[] args){
        System.out.println("Please input an integer:");
        Scanner scanner = new Scanner(System.in);//给定整数
        int stopNumber = scanner.nextInt();
        ArrayList<RationalNumber> list = new ArrayList();//存储所有符合要求的有理数
        if(stopNumber>0){//当给定整数大于0,将1加入list并且开始搜寻符合要求的其他有理数
            RationalNumber rationalNumber1 = new RationalNumber();
            rationalNumber1.setNum1(1);
            rationalNumber1.setNum2(1);
            rationalNumber1.setLayer(1);
            list.add(rationalNumber1);
            for(int i =0; i < Math.pow(2,stopNumber-1);i++){
                list = find(list.get(i),list,stopNumber);
            }
        }
        System.out.println("Rational Numbers:");
        System.out.print("0"+"  ");//单独将0输出,也可将其化为RationalNumber类加入list
        for(RationalNumber r : list){//输出结果
            System.out.print(r.getNum1()+"/"+r.getNum2()+"  ");
        }
    }

    /**
     * 计算节点rationlNumber的两个子节点并且存入list
     * @param rationalNumber
     * @param list
     * @param stopNumber
     * @return
     */
    public static ArrayList<RationalNumber> find(RationalNumber rationalNumber, ArrayList<RationalNumber> list, int stopNumber){
        if(rationalNumber.isFlag()|| rationalNumber.getLayer()>=stopNumber){
            return list;
        }
        RationalNumber nextRationalNumber = new RationalNumber();
        int temple = rationalNumber.getNum1()+ rationalNumber.getNum2();
        nextRationalNumber.setNum1(rationalNumber.getNum1());
        nextRationalNumber.setNum2(temple);
        nextRationalNumber.setLayer(rationalNumber.getLayer()+1);
        list.add(nextRationalNumber);//加入左子节点
        RationalNumber nextRationalNumber2 = new RationalNumber();
        nextRationalNumber2.setNum2(rationalNumber.getNum2());
        nextRationalNumber2.setNum1(temple);
        nextRationalNumber2.setLayer(rationalNumber.getLayer()+1);
        list.add(nextRationalNumber2);//加入右子节点
        rationalNumber.setFlag(true);//标记rationalNumber的子节点已计算过
        return list;
    }

}

输出结果:


【java】让n个线程顺序打印英文字母 要求如下:通过N个线程顺序打印26个英文字母,如给定N=3则输出: thread0: a thread1: b thread2: c thread0: d thread1: e ... 理解:个人理解,题目考察的是线程间的交互,如何让线程按顺序领取到各自的任务并按顺序打印结果。 解法一:轮询判断任务是否属于该线程,这种做法的优点是简单,但是不断轮询,在线程数多的情况下反而导致效率低 p... 阅读详情

相关推荐

如何判断实数?

可以通过此程序实现实数的判断。即通过比较数的ascii码来判断小数点的位置及个数即可。

递归——有理数树

描述 二叉树指的是一种树形结构,它的每个结点有至多两个子节点。 现在有一个由有理数组成的无穷二叉树形状如下: 1/1 ______|______ | | 1/2 2/1 ___|___ ___|___ | | ...

Haomin_Jia的博客 3595

基于STM32的HC-SR04超声波模块测距(新手级)

本人是嵌入式新手,学习了STM32的部分内容,最近想找些项目做,然后顺便学习了一下HC-SR04超声波模块,学习过程中也参考了一些大佬的文章。本文记录了自己的学习方法和学习过程,同时也希望能和各位大佬交流讨论。

weixin_63758495的博客 2206

有理数树 递归

十九世纪的时候,Moriz Stern (1858)与Achille Brocot (1860)发明了“一棵树”。据说,经由一些简单的规则而产生的这一棵树上,可以包含零以上所有的有理数。这棵树看起来大致这样: 你观察出规则了吗? 首先,他们在第一列放两个“分数”,第一个是0 / 1,代表0;第二个是1 / 0,代表无穷大。接着他们一列一列地产生这棵树,当他们要产生第k+1列的时候,就先把前k列所...

DaNIelLAk的博客 3440

Adams二次开发实战指南:从CMD到Python与插件开发全解析

本文全面解析Adams二次开发的三种核心方法:CMD命令、Python脚本和C++插件开发。通过实战案例展示如何实现参数批量修改、自动化仿真流程和定制功能开发,显著提升多体动力学仿真效率。特别适合需要处理复杂建模和重复性任务的工程师学习参考。

weixin_29235923的博客 129

EEGLAB数据预处理基本流程GUI实操指南

按钮,会出现如上图所示的长条形对话框,方框里面是所有电极的名称,这时将需要的剔除的电极选择上,如上图,我选择了 VEOG这个电极(该电极表示是垂直眼电),然后点“OK”,在弹出的对话框中自行确定是否需要修改命名。坏导是指在数据采集时,由于各种原因(如,电极本身问题或阻抗不好等)导致数据记录有问题,但是在后期又特别想要该通道的数据,那么就可以利用插值的方法进行——利用该导联周边的几个电极点的均值作为该导的数据。上图的图是通过IClabel的工具箱进行自动判断的,可以帮助自动识别出哪些是Eye的成分。

fdgdf5535的博客 6395

问题 E: 有理数树------------------------------------思维(递归+模拟)

题目描述 十九世纪的时候,Moriz Stern (1858)与Achille Brocot (1860)发明了“一棵树”。据说,经由一些简单的规则而产生的这一棵树上,可以包含零以上所有的有理数。这棵树看起来大致这样: 你观察出规则了吗? 首先,他们在第一列放两个“分数”,第一个是0 / 1,代表0;第二个是1 / 0,代表无穷大。接着他们一列一列地产生这棵树,当他们要产生第k+1列的时候,就先...

qq_43690454的博客 2441

Kali使用Metasploit内、外网渗透windows系统

Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具。当H.D. Moore在2003年发布Metasploit时,计算机安全状况也被永久性地改变了。 一、(内网渗透)内网英文缩写WAN;内网又称局域网 局域网的覆盖范围一般是方圆几千米之内,其具备的安装便捷、成本节约、扩展方便等特点使其在各类办公室内运用广泛。局域网可以实现文件管理、应用软件共享、打印机共享等功能,在使用过程当中,通过维护局域网网...

QQ670663的博客 2万+

Problem B. Rational Number Tree -Calkin–Wilf tree 数节点编号 基本数据类型范围

Problem Consider an infinite complete binary tree where the root node is 1/1 and left and right childs of node p/q are p/(p+q) and (p+q)/q, respectively. This tree looks like: 1/1 _____

兵临城下 2192

uniapp [安卓苹果App端] - 详细实现手机蓝牙连接打印机及打印票据小票/标签/面单/热敏小票订单/快递单等通用兼容适配解决方案,Uniapp对接蓝牙打印机支持各种主流品牌及打印指令,强悍插件

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果app,蓝牙打印机,uniappAPP实现通过蓝牙连接打印机打印,uniapp蓝牙连接打印机,安卓蓝牙打印插件,蓝牙打印机,蓝牙ble低功率及高功率打印机小票、标签、面单打印,手机PDA蓝牙打印插件,连接蓝牙打印机,蓝牙连接,打印文本、图片、条码、二维码,兼容斑马打印机、佳博打印机,TSC打印机,免费蓝牙打印机组件,蓝牙打印条码,蓝牙打印机连接,热敏蓝牙打印机,便携式打印机,打印机搜索不到,连接失败,发送打印命令

🏆 前端领域优质创作者 1万+

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口Java

本篇教程的Java程序中开始使用PostgreSQL之前,需要确保在计算机上设置了PostgreSQL JDBC和Java。您可以检查Java教程以在计算机上安装Java。现在让本篇教程检查如何设置PostgreSQL JDBC驱动程序。

No8g攻城狮的博客 1758

CF1089F Fractions

题意: 将n-1(n为正整数)分为若干个n的约数倍数和(约数不为1或n). n&lt;=1e9. 无解输出"NO". 题解: 先考虑无解的情况,因为n-1与n互质,故若所有约数的公约数不为1,则n-1一定不能被表示,即n为一个质数的次幂时无解。 接着考虑剩余情况是否一定有解。 因为多个数过于复杂,故先考虑两个数。首先这两个数要互质,设n-1=ax+by(x,y|n,x,y为互质的大于1的正整数),...

sz_165394732的博客 557

PCIe 6.0 – 关于 PCI Express Gen6 您需要知道的一切

幸运的是,PCIe 6.0 FEC 足够轻,对延迟的影响最小。在电气层上,PCIe 6.0 使用 PAM4 信号(“四级脉冲幅度调制”),每个时钟周期将 2 位组合为 4 个幅度级别(00、01、10、11),与 PCIe 5.0 和前几代相比,它使用 NRZ 调制,每个时钟周期 1 位和两个幅度级别 (0, 1)。虽然 PAM4 信号更容易出错,但由于调制技术的性质,与 PCIe 5.0 相比,通道损耗不受影响,因此 PCB 上 PCIe 6.0 信号的范围将与 PCIe 5.0 相同。

qq_43416206的博客 3433

Java中有理数类Rational Number详解

这里的各个方法之间都有很紧密的练习,小伙伴们要耐心地来回推敲哦 /** * Created with IntelliJ IDEA. * Description: Hello,I would appreciate your comments~ * User: 葛玉礼 * Date: 2022-03-19 * Destination:有理数之间的运算 */ public class RationalNumber { private int numerator;//分子 priva

Gremmie的博客 2413

华为MetaERP月结加速方案:并行关账技术深度解析

【摘要】华为MetaERP并行关账技术通过创新架构设计,将传统串行月结流程(8-12小时)优化为并行执行(2-4小时)。关键技术包括:1)基于DAG引擎的任务依赖分析,实现模块/子任务三级并行;2)Saga模式分布式事务保障数据一致性;3)动态资源分配算法提升CPU利用率至60-80%。实施效果显示月结时间缩短70%,成功率提升至99.8%,错误恢复时间减少75%。该方案为大型企业ERP系统提供了高效的月结加速方案,未来还将结合AI调度与混合云扩展持续优化。

金牌架构师 1441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

图解辗转相除法

前言 虽然在很久很久以前刚入门ACM的时候就已经知道辗转相除法的存在,并且也用GCD解了不少题,不过说实话辗转相除法的原理一直不是很清楚。 直到最近做到这样一道题: Codeforces - 343A,本以为是一道憨批构造,结果构造了两个小时都没出来,立刻自闭。 看了题解之后当即觉得基础数论白学了。毕竟能够证明gcd⁡(a,b)=gcd⁡(b,a mod b)\gcd(a, b) = \gcd(...

Dabria1999的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

有理数类

题目描述 有理数就是可以表示为两个整数的比值的数字。一般情况下,我们用近似的小数表示。但有些时候,不允许出现误差,必须用两个整数来表示一个有理数。 这时,我们可以建立一个“有理数类”,下面的代码初步实现了这个目标。为了简明,它只提供了加法和乘法运算。 class Rational { private long ra; private long rb; private long gcd(long a, long b){ if(b==0) return

qq_43699776的博客 330

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 有理数类——分数和整数;gcd最小公约数;

public class 有理数 { public static void main(String[] args) { Rational a = new Rational(1, 3); Rational b = new Rational(1, 6); Rational c = a.add(b); String result = c.toString(); System.ou...

七七的博客 377

JAVA实现有理数的运算+JAVA中的适配器模式

题目要求: 设计一个抽象类,声明有关算术运算的方法,并创建四个(或者一个)子类继承该抽象的类,完成进行加、减、乘、除四则运算。 整个题目总共经过了三轮完善,第一发没有利用抽象类,只是简单的实现了基本操作;第二枚用了四个子类去继承这个原有的抽象类,其中就用到了可以骗人的适配器模式,没有实现方法的重写,而是用的方法的重载;第三弹则是用一个子类去继承该抽象类,并重写了其中的抽象方法完成了运算。建议大

而濡木染 1517

用java具体代码实现分数(即有理数)四则运算

用java实现分数(即有理数)四则运算与用java代码具体实现 1,背景     Java老师布置了一个关于有理数运算的题目,因为书上有基本代码,所以自己主要是对书上代码做了一点优化,使其用户交互性更加友好以及代码封装性更强 2,说明:     分数也称作有理数,是我们很熟悉的一种数。有时希望程序能对分数进行四则运算,而且两个分数四则运算的结果仍然是分数。下面是具体实现

孙琨SealSun 8454

Java实现有理数

有理数是由分子、分母以形式a/b表示的数(b!=0)。 Java提供了整数和浮点数的数据类型,但没有提供有理数的类。本程序实现扩充有理数。

Jiafu_Liu的博客 2322

Java+Spring+Mybatis+Sqlite3 简易图数据库

【原创内容,转载需作者同意】Java+Spring+Mybatis+Sqlite3 简易图数据库,使用了注解的方式。这个程序主要是为了了解图数据库,同时学习Spring,Mybatis的简单使用,因此还存在很多不足或者错误。该图数据库实现流量基本的增删改查,以及联表查询某个节点的N阶关系,是本人作为了解图数据库所做的练习,所操作数据表内容为公司职员信息,共两张数据表,一张为vertex(ID,NA...

bbp94_github的博客 1583

《Head First Java》 个人笔记

【原创内容,转载需作者同意】 Head First Java 个人笔记,GUI部分没有细看,用Xmind软件制作的思维导图,有些地方是个人理解,若有错误欢迎指出。这本书诙谐幽默,图文并茂,举的例子也易于理解,非常适合Java初学者。 附:Head First Java 电子书资源 链接:https://pan.baidu.com/s/1t7IZGEg8b9f72aIgznuCuw 密码...

bbp94_github的博客 995

【Java】散列

若知道一个数组中元素的索引,可以使用索引在O(1)时间内获得元素。若将map中值存储在数组当中,并使map的键通过一个函数映射到值的索引上的话,就能利用键快速获取值。以上,存储了具有键值对的对象的数组称为散列表,映射函数称为散列函数。散列是一种无需执行搜索即可通过从键得到的索引来获取值的技术。java中,map是一种使用散列实现的数据结构。 典型的散列函数首先将搜索键转换为一个称为散列码的整数值...

bbp94_github的博客 749
上一篇: Java+Spring+Mybatis+Sqlite3 简易图数据库
下一篇: 环境配置相关
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值