oj(二)c

原创 2014年06月19日 19:03:34

问题:

//Description
//编写分数类Fraction,实现两个分数的加、减、乘和除四则运算。主函数已给定。
//Input
//每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束。
//Output
//空格分隔的两个分数的减和除的结果。

 

程序:

#include <iostream>

using namespace std;
class Fraction
{
private:
    int nume;                                   // 分子
    int deno;                                   // 分母
public:
    Fraction(int n=0,int d=0);
    friend int tong(Fraction c1,Fraction c2); //友元函数
    friend void hua(int *de,int *nu);           //为了保留计算所得值,用指针
    //构造函数及运算符重载的函数声明
    Fraction operator+(Fraction &c);
    Fraction operator-(Fraction &c);
    Fraction operator*(Fraction &c);
    Fraction operator/(Fraction &c);
    bool operator==(int n);
    friend istream&operator>>(istream&,Fraction&);
    void output();
};
int tong(Fraction c1,Fraction c2)            //通分
{
    int t[8]={2,3,5,7,11,13,17,19},de1=c1.deno,de2=c2.deno,g=1;
    for(int i=0;i<8;i++)
    {
        while(de1%t[i]==0&&de2%t[i]==0)
        {
            de1/=t[i];
            de2/=t[i];
            g*=t[i];
        }
    }
    g*=(de1*de2);
    if(g<0)
    {
        g=-g;                                   //如果分数是负数
    }
    return g;
}
void hua(int *de,int *nu)
{
    int t[8]={2,3,5,7,11,13,17,19};
    for(int i=0;i<8;i++)
    {
        while(*de%t[i]==0&&*nu%t[i]==0)
        {
            *de/=t[i];
            *nu/=t[i];
        }
    }
}
void Fraction::output()
{
    if(nume==deno||nume==-deno)
    {
        cout<<(nume/deno);
    }
    else if(deno<0)
    {
        nume=-nume;deno=-deno;
        cout<<nume<<"/"<<deno;
    }
    else if(nume==0)
    {
       cout<<nume;
    }
    else
    {
        cout<<nume<<"/"<<deno;
    }
}
Fraction::Fraction(int n,int d)
{
    nume=n;
    deno=d;
}
Fraction Fraction::operator+(Fraction &c)
{
    int g,n;
    g=tong(*this,c);
    n=nume*(g/deno)+c.nume*(g/c.deno);
    hua(&g,&n);
    return Fraction(n,g);                     //直接返回对象并赋值
}
Fraction Fraction::operator-(Fraction &c)
{
    int g,n;
    g=tong(*this,c);
    n=nume*(g/deno)-c.nume*(g/c.deno);
    hua(&g,&n);
    return Fraction(n,g);
}
Fraction Fraction::operator*(Fraction &c)
{
    int d,n;
    d=deno*c.deno;
    n=nume*c.nume;
    hua(&d,&n);
    return Fraction(n,d);
}
Fraction Fraction::operator/(Fraction &c)
{
    Fraction c1;
    int n;
    c1=c;
    n=c1.deno;
    c1.deno=c1.nume;
    c1.nume=n;
    return (*this)*c1;
}
bool Fraction::operator == (int n)
{
    bool g=false;
    if(nume==n)
    {
        g=true;
    }
    return g;
}
istream&operator>>(istream&input,Fraction&c)
{
    input>>c.nume>>c.deno;
    return input;
}
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;
}

 

结果:

△【OJ】(二)---C---分数类的四则运算

 题目要求如下: -----------------------------------------------------------------------------------...

基础 c/c++ oj练习

  • 2015年08月30日 09:46
  • 251KB
  • 下载

【九度OJ】1485【密码】【C实现】【北大2012】

题不难,挺有意思的,是个解密的过程
  • ALiTuTu
  • ALiTuTu
  • 2014年09月20日 15:33
  • 480

第18周OJ问题 C: 复仇者联盟之数组成绩统计

/* *All rights reserved. *文件名称:main.cpp *作 者:姜 甜 甜 *完成日期:2014年12月28日 *版 本 号:v1.0 ...
  • tingary
  • tingary
  • 2014年12月28日 09:46
  • 846

<C/C++算法>九度OJ题目1465--1515解题练习(九)

题目描述: 给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合。...

北邮OJ-257- 最近公共祖先-14软院上机C

本题的思路是利用树的双亲表示法(并查集模板)进行寻根(findRoot方法)压栈,把每一级的父节点都压栈。然后从上往下逐一比对即可。Problem C. 最近公共祖先 题目描述 给出一棵有N个节点...

<C/C++基础>九度OJ题目1050--1100解题练习(三)

题目1050:完数 题目描述: 求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子相加和的数...

<C/C++算法>九度OJ题目1151--1200解题练习(五)

题目1151:位操作练习 题目描述: 给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位而得到。 循环左移和普通左移的区...

南邮 OJ 1882 C. 数字串划分

C. 数字串划分 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 25            测试通过 : ...

玲珑OJ 1098 && Round #11 C 萌萌哒的第三题 [并查集+思维]【数据结构】

题目链接:http://www.ifrog.cc/acm/problem/1098 —————————————————————————————————————————————————————————...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oj(二)c
举报原因:
原因补充:

(最多只允许输入30个字)