Rational Arithmetic

2023-11-30 15:44
文章标签 arithmetic rational

本文主要是介绍Rational Arithmetic,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                                                              

                                   📑打牌 : da pai ge的个人主页
                                   🌤️个人专栏 : da pai ge的博客专栏
                                  ☁️宝剑锋从磨砺出,梅花香自苦寒来

☁️有理数运算

实现对两个有理数的基本运算,包括加、减、乘、除。
输入描述:
每个输入文件只包含一个测试用例,测试用例会给出一行数据,格式为 “a1/b1 a2/b2”
分子分母的范围都在长整型的范围内,如果数字为负,则符号只会出现在分子的前面。分母一定是非零数。
输出描述:
针对每个测试用例,都输出四行,分别是这两个有理数的和、差、积和商,格式为 1 操作符 数 2 = 结果 。注
意,所有的有理数都将遵循一个简单形式 “k a/b” ,其中 k 是整数部分, a/b 是最简分数形式,如果该数为负数,则必
须用括号包起来。如果除法中的除数为 0 ,则输出 “Inf” 。结果中所有的整数都在 long int 的范围内。

☁️【题目解析】

本题看上去不难,但是存在几个问题:
1 、除数为 0 ,这个很好解决,做个判断即可。
2 、负数的输出,这个只要一个标签即可。
3 、题目中虽然没有明说,但是这个数字处理后其实是有可能不存在分数部分或者整数部分的。也就是说将数据处
理完形成 k a/b 的格式后,有可能只有一个 k ,也可能只有一个 a/b ,也有可能两者皆有,所以要分别考虑这几种情
况。

☁️【解题思路】

可以尝试实现一个有理数类,将数据处理后重载一下加减乘除即可。处理数据的方法就是除一下 mod 一下的问题,
加减乘除遵循基本的分数加减乘除原则,最后求一下最大公约数,做一下约分,再处理一下数据,就 OK 了。

☁️【示例代码】

import java.util.*;
// s and the denominators
class Rational{
private long numerator; // 分子
private long denominator; // 分母
private long integer; // 整数部分
private boolean negetive = false; // 负数
private boolean isZero = false; // 分母为零
private long totalNumerator; // 参与运算的分子:整数+原来分子
public static long paraseNumerator(String s){
//只需从字符串中将分子截取出来
return Long.parseLong(s.substring(0, s.indexOf('/')));
}
public static long paraseDenominator(String s){
//只需从字符串中将分子截取出来
return Long.parseLong(s.substring(s.indexOf('/')+1, s.length()));
}
public Rational(long n, long d){
// 在输入的时候分母永远不可能为0,但是经过计算之后分母可能会为0
if(0 == d){
isZero = true;
return;
}
// 如果分子小于0,表示为负数
if(n < 0){
negetive = !negetive;
}
// 在输入的时候,分母永远不可能小于0,但是经过计算之后分母也可能会小于0
if(d < 0){
negetive = !negetive;
}
// 如果输入是假分数,需要将其调整为真分数,比如:5 / 3 ===> 1 2/3
integer = n / d;
numerator = n - integer * d;
denominator = Math.abs(d);
// 如果分数不是最简的形式,需要将其约分为最简的形式,比如:10 / 15--->2/3
// 在分子和分母的基础之上分别处以分子和分母的最大公约数
if(numerator > 1 || numerator < -1){
long gcd = calcGCD(Math.abs(numerator), denominator);
if(gcd > 0){
numerator /= gcd;
denominator /= gcd;

这篇关于Rational Arithmetic的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437606

相关文章

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

[ABC369C] Count Arithmetic Subarrays

首先看了下题意 大致题意就是让你在长度为的序列找出所有的等差数列。 -----------------------------------------------------------------------------------------我是分界线 我的思路了,就是先从2开始计算等差数列,从3开始判断,如果是等差数列的话就继续累加,如果不是判断它是否是第一个等差数列,是就直接,如果

LeetCode 446. Arithmetic Slices II - Subsequence

一道长得一副dp的样子的dp题。 这道题难度不算特别大,因为看得出来肯定是dp题。因为,一个等差序列里面有好几个小的等差序列。 例如,2 4是一个等差序列,2 4 6是一个等差序列。 所以我们发现等差序列是可以扩展的。 那么就得到了,咱们的转移方程的一部分 dp[i][delta]=dp[j][delta]+1 dp[i][delta] = dp[j][delta] + 1

ABC 362 E - Count Arithmetic Subsequences

原题链接:E - Count Arithmetic Subsequences 题意:给出长度为n的数组,要求找出所有的等差数列,并且按照长度递增输出。 思路:dp,因为是要找出等差数列,并且这题的数据量极小,所以可以考虑设计dp数组,dp[i][j][k][v],i代表当前寻找的等差数列倒数第二项,j代表最后一项,k代表还需要寻找的长度,v代表当前判断的数,dp[i][j][k][v]代表以i

413. Arithmetic Slices 等差数列划分

https://leetcode-cn.com/problems/arithmetic-slices/description/ 思路:题目很冗长,实际上就是找有几个等差数列(长度大于3的).i作为序列头,从0开始到N-3遍历数组,首先找一个最短的等差序列(长度为3),找到后算出间距dist,再以j为序列尾,从i+3开始到N向后扩张,看等差序列是否还存在后续.只要找到一个间距不等于dist,表明在

【UML】UML几种图的绘制_结合Rational Rose

本文转自http://blog.csdn.net/xiaowei_cqu/article/details/7773814 UML几种图的绘制 UML是Unified Modeling Language(统一建模语言)的简称。UML是对软件密集型系统中的制品(软件开发过程中产生的各种各样的产物,如模型、源代码、测试用例等)进行可视化、详述、构造和文档化的语言。 UM

POJ 3006 Dirichlet's Theorem on Arithmetic Progressions

分析: 这道题要先用筛法求出10^6以内的素数。。。。我竟然觉得数据太多没用这种方式,然后写出来的代码就运行超时了,呜呜……最后还是用的筛法 Description If a and d are relatively prime positive integers, the arithmetic sequence beginning with a and increasing b

cf——C. Arithmetic Progression

Everybody knows what an arithmetic progression is. Let us remind you just in case that an arithmetic progression is such sequence of numbers a1, a2, ..., an of length n, that the following cond

uva 11657 - Rational Billiard(数学)

题目链接:uva 11657 - Rational Billiard 题目大意:给定一个边界M,N,以及第一个球和第二个球的位置,第一个球以p,q的方向移动,碰到边界后被反弹,和光线的路线一致,问有没有可能集中第二个球。 解题思路:在网上参考别人的思路,首先将横纵坐标扩大相应倍数,保证p,q每移动一次对应在新平面为单位长度,然后只需要考虑横向移动所需要的步数,减掉纵向移动所需的步数后,剩

sonobe:针对IVC的fold arithmetic电路实例

1. 引言 近日,arnaucube发推宣称 在EVM链(Optimistic)上验证了首个Nova+CycleFold proof,对应开源代码实现见: https://github.com/privacy-scaling-explorations/sonobe(Rust + Solidity) sonobe为: 0xPARC和PSE团队联合开发的folding schemes库采用模块