Description

编写分数类Fraction,实现两个分数的加、减、乘和除四则运算。主函数已给定。

Input

每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束。

Output

空格分隔的两个分数的减和除的结果。

Sample Input

1 2 -1 2
4 3 3 4
0 0 0 0

Sample Output

1 -1
7/12 16/9

(1)普通版。

/* All rights reserved.
* 文件名:test.cpp
* 作者:陈丹妮
* 完毕日期:2015年 7 月 2 日
* 版 本 号:v1.0
*/
#include <iostream>
using namespace std;
class Fraction
{
private:
int x;
int y;
public:
Fraction(int a=0,int b=1):x(a),y(b) {}
friend istream& operator>>(istream& input,Fraction &f);
bool operator ==(int a);
void output();
Fraction operator -(Fraction &f1);
Fraction operator /(Fraction &f1);
};
istream& operator>>(istream& input,Fraction &f)
{
input>>f.x>>f.y;
return input;
}
bool Fraction::operator==(int a)
{
if(x==a)
return true;
else
return false;
}
Fraction Fraction::operator -(Fraction &f1)
{
Fraction f;
f.x=x*f1.y-f1.x*y;
f.y=y*f1.y;
return f;
}
Fraction Fraction::operator /(Fraction &f1)
{
Fraction f;
if(!f1.x) return *this;
f.x=x*f1.y;
f.y=y*f1.x;
return f;
}
void Fraction::output()
{
int r,m=x,n=y,t;
if(m<n)
{
t=n;
n=m;
n=t;
}
while(n!=0)
{
r=m%n;
m=n;
n=r;
}
if(y==m)
cout<<x/m;
else if(x/m<0&&y/m<0)
cout<<(-1)*x/m<<'/'<<(-1)*y/m;
else if(y/m<0)
cout<<-x/m<<'/'<<-y/m;
else
cout<<x/m<<'/'<<y/m;
} int main()
{
Fraction f1,f2,f3;
while(cin>>f1>>f2)
{
if(f1==0&&f2==0)
break;
f3=f1-f2;
f3.output();
cout<<" ";
f3=f1/f2;
f3.output();
cout<<endl;
}
return 0;
}

(2)函数版

#include <iostream> 

using namespace std;
int gcd(int d,int n);
class Fraction
{
private:
double deno; //分母
double nume;//分子
public:
Fraction();
Fraction operator-(Fraction &f);
Fraction operator/(Fraction &f);
friend istream & operator>>(istream &input,Fraction &f);
bool operator==(int c);
void output();
void simplify();
};
void Fraction::output()
{
if(nume/deno==int(nume/deno))
cout<<nume/deno;
else
{
if(nume>0&&deno<0)
{
nume=-nume;
deno=-deno;
}
else
{
nume=nume;
deno=deno;
}
cout<<nume<<"/"<<deno;
} }
bool Fraction::operator==(int c)
{
if(nume==0&&c==0)
return true;
else return false;
} istream & operator>>(istream &input,Fraction &f)
{
input>>f.nume>>f.deno;
return input;
}
void Fraction::simplify()
{
int n=gcd(deno, nume);
deno/=n; // 化简
nume/=n;
}
Fraction::Fraction()
{
deno=0;
nume=1;
}
Fraction Fraction:: operator-(Fraction &c)
{
Fraction t;
t.nume=nume*c.deno-c.nume*deno;
t.deno=deno*c.deno;
t.simplify();
return t;
}
Fraction Fraction:: operator/(Fraction &c)
{
Fraction t;
if (!c.nume) return *this; //除法无效时,这样的情况须要考虑。但这样的处理仍不算合理
t.nume=nume*c.deno;
t.deno=deno*c.nume;
t.simplify();
return t;
}
int gcd(int m, int n) //这个函数能够定义为类的成员函数,也能够为一般函数
{
int r;
if (m==0)
{
return n;
}
while(r=m%n) // 求m,n的最大公约数
{
m=n;
n=r;
}
return n;
}
int main() { Fraction f1,f2,f3; while(cin>>f1>>f2) { if(f1==0&&f2==0) break; f3=f1-f2; f3.output();
cout<<' ';
f3=f1/f2; f3.output(); cout<<endl; } return 0; }
/* All rights reserved.
* 文件名:test.cpp
* 作者:陈丹妮
* 完毕日期:2015年 7 月 2 日
* 版 本 号:v1.0
*/
#include <iostream>
using namespace std;
class Fraction
{
private:
int x;
int y;
int e;
public:
Fraction(int a=0,int b=1):x(a),y(b)
{
e=0;
}
friend istream& operator>>(istream& input,Fraction &f);
bool operator ==(int a);
void output();
Fraction operator -(Fraction &f1);
Fraction operator /(Fraction &f1);
};
istream& operator>>(istream& input,Fraction &f)
{
input>>f.x>>f.y;
return input;
}
bool Fraction::operator==(int a)
{
if(x==a)
return true;
else
return false;
}
Fraction Fraction::operator -(Fraction &f1)
{
Fraction f;
f.x=x*f1.y-f1.x*y;
f.y=y*f1.y; return f; }
Fraction Fraction::operator /(Fraction &f1)
{
Fraction f;
if (!f1.x) return *this;
f.x=x*f1.y;
f.y=y*f1.x;
return f;
}
void Fraction::output()
{
int r,m=x,n=y,t;
if(m<n)
{
t=n;
n=m;
n=t;
}
while(n!=0)
{
r=m%n;
m=n;
n=r;
}
if(y==m)
cout<<x/m;
else if(x/m<0&&y/m<0)
cout<<-x/m<<'/'<<-y/m;
else if(y/m<0)
cout<<-x/m<<'/'<<-y/m;
else
cout<<x/m<<'/'<<y/m;
if(e==0)
cout<<" ";
e++;
} int main()
{
Fraction f1,f2,f3;
while(cin>>f1>>f2)
{
if(f1==0&&f2==0)
break;
f3=f1-f2;
f3.output();
f3=f1/f2;
f3.output();
cout<<endl;
}
return 0;
}

学习心得:这道题提交了非常多次。原来就是由于没有考虑分子为0的情况,导致错误。前两个都AC对了,最后一个没有AC可是,编译时都是对的,就是不知道格式是哪里出错了。希望有人能帮我指出来,谢谢,继续努力吧!!

!

第十七周oj刷题——Problem B: 分数类的四则运算【C++】的更多相关文章

  1. 第十六周oj刷题——Problem I: 改错题:类中私有成员的訪问

    Description 改错题: 设计一个日期类和时间类,并编写全局函数display用于显示日期和时间. 要求:display函数作为类外的普通函数,而不是成员函数 在主函数中调用display函数 ...

  2. 第十六周oj刷题——Problem E: B 构造函数和析构函数

    Description 在建立类对象时系统自己主动该类的构造函数完毕对象的初始化工作, 当类对象生命周期结束时,系统在释放对象空间之前自己主动调用析构函数. 此题要求: 依据主程序(main函数)和程 ...

  3. 第十六周oj刷题——Problem J: 填空题:静态成员---计算学生个数

    Description 学生类声明已经给出.在主程序中依据输入信息输出实际建立的学生对象个数,以及全部学生对象的成绩总和. Input 学生个数 相应学生个数的学生信息(姓名    年龄    成绩) ...

  4. 第十五周oj刷题——Problem M: C++习题 矩阵求和--重载运算符

    Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<&quo ...

  5. Sublime Text3 配置C++(附oj刷题常用模板)

    # 下载对应平台的sublime sublime最新版下载, 字体样式个人喜欢Consolas, 另附注册码: -– BEGIN LICENSE -– TwitterInc 200 User Lice ...

  6. Problem E: 分数类的输出

    Problem E: 分数类的输出 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2699  Solved: 1227[Submit][Status][ ...

  7. Leetcode OJ 刷题

    Valid Palindrome吐槽一下Leetcode上各种不定义标准的输入输出(只是面试时起码能够问一下输入输出格式...),此篇文章不是详细的题解,是自己刷LeetCode的一个笔记吧,尽管没有 ...

  8. 小米OJ刷题日志

    虽然这OJ上的题比较水,但还是挺有意思的.关键是能赚钱 特别是提交方式 居然不支持C++,垃圾OJ 4. 最长连续数列 排序后dp 5. 找出旋转有序数列的中间值 写个排序就做完了. 6. 交叉队列 ...

  9. 九度OJ刷题报告

    从8月初到现在,已经刷了400道题,越到后面题目越难,但仍会继续努力. 现将自己所AC的代码贴到博客上整理,同时供大家交流参考. 所有代码均为本人独立完成,全部采用C语言进行编写.

随机推荐

  1. Hibernate 命名查询NamedQuery (转)

    转自:http://blog.163.com/ksm19870304@126/blog/static/374552332011993942391/ 配置方式: static List namedQue ...

  2. Oracle EBS-SQL (WIP-14):检查车间需求与BOM差异对照.sql

    select a.*, b.BOM定额, a.WIP定额 - b.BOM定额     差异 from (select WE.WIP_ENTITY_NAME                        ...

  3. [问题解决] /home目录占用率100%

    今天发现一个比较奇怪的现象,linux系统下一个目录挂在存储下,df -Th 显示该目录使用率100%, du 该目录显示只用了2%, 后来发现是由于进程占用了被删掉的文件空间导致.举例如下: [ro ...

  4. Oracle导出空表处理方法

    exp或是expdp命令在导出数据的时候会把表记录数为0的表过滤掉,无法导出.通过如下方法可以导出记录数0的表.   1.先查询一下哪些表是空的: select table_name from use ...

  5. fragment中listview触发事件setOnItemClickListener不好使

    <listView/>中// listview点击 ,高度wrap_content改成fill_prarent

  6. LFM 隐语义模型

    隐语义模型: 物品       表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣 表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣 ...

  7. opennebula extend(expending) auth module ldap

    LDAP Authentication addon permits users to have the same credentials as in LDAP, so effectively cent ...

  8. string 转换char类型

    将string转换成char类型 const char *c = string.c_str() char转换string char *c_name = "char" string ...

  9. 关于优化性能<主要是速度方面>的个人心得 【转】

    一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...

  10. js数组和对象互转方法

    <script> let arr = [2, 3, 4, 2, 3, 4]; // 数组转化为对象 function toObject(arr) { let obj = { } for(l ...