1034 有理数四则运算

news/2024/7/7 19:24:35

1. 起先,一个用例浮点错误,但是在进入出发之前,明明已经有判断被除数的分子是否为0,另有一个答案错误,但是和书上代码对照,没有区别。题目中说:“题目保证正确的输出中没有超过整型范围的整数”。注意了,这里输出的是化简后,那么化简之前呢?很有可能超过int范围!所以通过搜索键,把用到的int一律换成long long。

2. 这道题就是为书上的讲解思路量身定制的(或者说书上是为这道题量身定制的),有以下注意点

(1)用结构体来表示有理数(整数是分母为1的有理数),且保证要负也是分子为负,如果分子为0,则分母为1,约分函数reduction不仅仅做约分这一件事,而且负责纠正不符合格式的。约分的时候要注意的是,求最大公约数函数gcd默认接收的是整数,而分数的分子也许为负,因此要用它的绝对值。

fraction reduction(fraction r){if(r.mom<0){//分母为负数,让其成为规定的分数的模样 r.son = -r.son;r.mom = -r.mom;}if(r.son == 0){r.mom = 1;}else{LL m = gcd(abs(r.son),r.mom);//最大公因子:取绝对值很容易丢 //约分r.son /= m;r.mom /= m; }return r;
}

(2) 由于月份的时候会用到求最大公约数,所以最大公约数的函数,显然要会写,注意参数和返回值的类型

LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);
}

(3) 对于输出函数printf,注意要首先对传入的有理数进行约分,然后分为整数、假分数、真分数三种类型输出(此题还要额外判断正负决定是否加括号)。其中稍微麻烦一些的是假分数需要考虑负数的情况。化成整数+真分数的形式后,真分数的分子要用绝对值。

void print(fraction r){//输出化简后的分数r = reduction(r);if(r.mom == 1){//整数(当然包括0)if(r.son<0)printf("(%lld)",r.son);//如果是负数 else printf("%lld",r.son);}else if(abs(r.son)>r.mom){//假分数 if(r.son<0)printf("(%lld %lld/%lld)",r.son/r.mom,abs(r.son)%r.mom,r.mom);else printf("%lld %lld/%lld",r.son/r.mom,abs(r.son)%r.mom,r.mom); }else{//真分数 if(r.son<0)printf("(%lld/%lld)",r.son,r.mom);else printf("%lld/%lld",r.son,r.mom);}
}

(4) 此外加减乘除的函数各自就看数学基础了,对于除法可以不在函数里面判断除数是否为0,可以在调用之前判断,要是为0就不去调用。

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
#include<stdlib.h>
#include<time.h>using namespace std;
typedef long long LL;const int maxn = 100010;
const int MOD = 1000000007;
const int INF = 1000000000;//INF:下确界  
const LL SUP = (1LL<<63)-1;//SUP:上确界 
const double eps = 1e-5;struct fraction{LL son;LL mom;
};LL gcd(LL a,LL b){return !b?a:gcd(b,a%b);
}fraction reduction(fraction r){if(r.mom<0){//分母为负数,让其成为规定的分数的模样 r.son = -r.son;r.mom = -r.mom;}if(r.son == 0){r.mom = 1;}else{LL m = gcd(abs(r.son),r.mom);//最大公因子:取绝对值很容易丢 //约分r.son /= m;r.mom /= m; }return r;
}void print(fraction r){//输出化简后的分数r = reduction(r);if(r.mom == 1){//整数(当然包括0)if(r.son<0)printf("(%lld)",r.son);//如果是负数 else printf("%lld",r.son);}else if(abs(r.son)>r.mom){//假分数 if(r.son<0)printf("(%lld %lld/%lld)",r.son/r.mom,abs(r.son)%r.mom,r.mom);else printf("%lld %lld/%lld",r.son/r.mom,abs(r.son)%r.mom,r.mom); }else{//真分数 if(r.son<0)printf("(%lld/%lld)",r.son,r.mom);else printf("%lld/%lld",r.son,r.mom);}
}fraction add(fraction r1,fraction r2){fraction r3;r3.son = r1.son*r2.mom + r2.son*r1.mom;r3.mom = r1.mom*r2.mom;return reduction(r3);
}fraction minu(fraction r1,fraction r2){fraction r3;r3.son = r1.son*r2.mom - r2.son*r1.mom;r3.mom = r1.mom*r2.mom;return reduction(r3);
}fraction multi(fraction r1,fraction r2){fraction r3;r3.son = r1.son*r2.son;r3.mom = r1.mom*r2.mom;return reduction(r3);
}fraction divide(fraction r1,fraction r2){//不在函数里面做除数是否为0的合法校验 fraction r3;r3.son = r1.son*r2.mom;r3.mom = r1.mom*r2.son;return reduction(r3);
}int main(){fraction r1,r2;scanf("%lld/%lld %lld/%lld",&r1.son,&r1.mom,&r2.son,&r2.mom);print(r1);printf(" + ");print(r2);printf(" = ");print(add(r1,r2));printf("\n");print(r1);printf(" - ");print(r2);printf(" = ");print(minu(r1,r2));printf("\n");print(r1);printf(" * ");print(r2);printf(" = ");print(multi(r1,r2));printf("\n");print(r1);printf(" / ");print(r2);printf(" = ");if(r2.son!=0)print(divide(r1,r2));else printf("Inf");printf("\n");return 0;
}


http://lihuaxi.xjx100.cn/news/241236.html

相关文章

php 关闭当前网页代码,js实现关闭网页的代码

本文主要和大家分享js实现关闭网页的代码&#xff0c;希望能帮助到大家。关闭很简单的关闭本页面的方法&#xff0c;没有其他额外的提示&#xff1a;window.openernull; //返回对创建该窗口的 Window 对象的引用。window.open(, _self); //方法用于打开一个新的浏览器窗口或查找…

1049 Counting Ones

1. 这一题起初我用递归的方式&#xff0c;还写了一个数整数有多少个1的函数&#xff0c;OneNum[i] OneNum[i-1]countOne(i);毫不意外地出现了段错误&#xff0c;也就是递归调用的次数太多。 2. 看了参考书&#xff0c;得到了思路上的启发&#xff1a; 给定一个数12&#xff…

模态框获取id一直不变,都是同一个id值

2019独角兽企业重金招聘Python工程师标准>>> $(.refund-btn).click(function(){//此处必须是$(this),否则$(.refund-btn)重新获取&#xff0c;导致值一直不变var id $(this).attr(data-id);//var id $(.refund-btn).attr(data-id);错误&#xff0c;这样会导致一直…

Java Json API:Gson使用简单入门

GSON是Google开发的Java API&#xff0c;用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问&#xff1a;http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础&#xff0c;因此不需要任何GSON…

php tab标签,JavaScript代码分享:tab标签的切换

本文实例讲述了js实现点击切换TAB标签。分享给大家供大家参考。具体如下&#xff1a;这里演示的选项卡效果代码&#xff0c;无jq,纯JS来实现&#xff0c;灰色风格&#xff0c;没有怎么美化&#xff0c;或许看上去比较普通&#xff0c;不过兼容性和操作起来挺舒服的&#xff0c;…

1003 我要通过!

1. 总体思路是自己先写写&#xff0c;看看哪些字符串符合&#xff0c;找出规律&#xff0c;然后根据测试用例来矫正。 2. 用到了递推的方法&#xff0c;我使用countA[maxn]数组存放截至当前位置一共出现的A的个数。 3. 正确的字符串满足的条件是&#xff1a;P之前A的个数P和T…

java正则表达式学习

1.简单认识正则&#xff1a;       public class Test {public static void main(String[] args) {//简单认识正则p("abc".matches("..."));p("a8729a".replaceAll("\\d", "-"));}public static void p(Object o){Sys…

KDD 2017奖项全公布,华人成最大赢家

雷锋网按&#xff1a;本文由雷锋网作者奕欣、岑峰、张驰、三川联合编辑。 北京时间8月15日&#xff0c;在经过两天的Tutorial和Workshops后&#xff0c;KDD 2017于今天下午正式开幕。 开场&#xff0c;KDD 2017大会主席Stan Matwin向我们展示了一组数据&#xff1a;本次KDD共有…