zoukankan      html  css  js  c++  java
  • Problem S: 分数类的模板数组类

    Problem S: 分数类的模板数组类

    Time Limit: 3 Sec  Memory Limit: 128 MB
    Submit: 2155  Solved: 1624
    [Submit][Status][Web Board]

    Description

    封装一个模板数组类Array,支持一下操作:
    1. 构造函数Array(int n),将数组初始化为n个存储空间;
    2. 函数input(int n),读取最多n个元素,但不能超过数组存储空间的上限;
    3. 重载下标运算符,返回数组的元素。
     
    封装一个分数类Fract,用来处理分数功能和运算,能支持你的Array类使用。
    1. 构造:传入两个参数n和m,表示n/m;分数在构造时立即转化成最简分数。
    2. show()函数:分数输出为“a/b”或“-a/b”的形式,a、b都是无符号整数。若a为0或b为1,只输出符号和分子,不输出“/”和分母。
    3. 在分数类上重载+=运算符,进行分数的加法运算。
     
    -----------------------------------------------------------------------------
     
    你设计两个类:Array类和Fract类,使得main()函数能够运行并得到正确的输出。调用格式见append.cc
     

    Input

    输入为两部分,分别是一组实数测试样例和一组复数测试样例。
     
    这两组测试样例都以正整数n,且n小于1000,n表示需要输入n个实数(或分数)。
     
    测试样例的第二行开始为n个实数(或分数)。其中每个分数输入为两个整数n、m,表示分数n/m。
     

    Output

    第一部分输出一个实数,是第一组测试样例之和;第二部分输出一个分数,是第二组测试样例之和。
     
    分数输出时为最简形式,负号只会出现在最前面,若分母为1或分子为0,则只输出一个整数,即分子部分,而没有“/”和分母部分。

    Sample Input

    4
    6 8 7 5
    9
    1 3
    20 -15
    80 150
    -9 1
    6 6
    12 16
    -33 -48
    6 11
    0 -10
    

      

    Sample Output

    26
    -17117/2640

    HINT

     

    Append Code

    #include <iostream>
    #include <cmath>
    #include <vector>
    using namespace std;
    int yinshu(int x, int y)
    {
        int mm;
        if(x>y)
            mm=y;
        else
            mm=x;
        int temp;
        for(int i=1; i<=mm; i++)
            if(x%i==0&&y%i==0)
            temp=i;
        return temp;
    }
    template <typename T>
    class Array
    {
    public :
        vector<T> num;
        int len;
        Array(int n):len(n){}
        void input(int n)
        {
            for(int i=0; i<n&&i<len; i++)
            {
                T temp;
                cin>>temp;
                num.push_back(temp);
            }
        }
        T &operator[](int n){return num[n];}
    };
    class Fract
    {
    public :
        int n, m;
        int t;
        Fract(int x=0, int y=1)
        {
            int min_;
            if(x*y<0) t=-1; else t=1;
    
            int xx=x, yy=y;
    
            if(xx<0) xx=-xx;
            if(yy<0) yy=-yy;
    
            if(xx>yy) min_=yy; else min_=xx;
            for(int i=min_; i>1; i--)
                if(xx%i==0&&yy%i==0)
            {
                xx/=i; yy/=i;
            }
            n=xx*t; m=yy;
        }
        Fract &operator+=(Fract &p)
        {
            Fract temp(n*(p.m)+(p.n)*m,m*(p.m));
            return *this=temp;//必须返回本身。
        }
        void show()
        {
            if(n==0) cout<<0<<endl;
            else if(m==1)  cout<<n<<endl;
            else
            cout<<n<<"/"<<m<<endl;
    
        }
        friend istream &operator>>(istream &is, Fract &p)
        {
            int x, y;
            is>>x>>y;
            Fract temp(x,y);
            p.n=temp.n; p.m=temp.m;
            return is;
        }
    };
    int main()
    {
        int  n;
        cin >> n;
        Array<double> db(1000);
        db.input(n);
        double dbsum(0.0);
        for(int i = 0; i < n; i++)
            dbsum += db[i];
        cout << dbsum << endl;
    
        cin >> n;
        Array<Fract> fr(1000);
        fr.input(n);
        Fract frsum(0, 1);
        for(int i = 0; i < n; i++)
            frsum += fr[i];
        frsum.show();
    }
    

      

    作者:7oDo

    仅供参考,请勿抄袭。

    Hang Hang Hang !!!

  • 相关阅读:
    全区停水,测什么时候来水。
    和电脑打国标麻将,一定要注意
    这是一个可怕的交易
    起一卦,还是这样。什么时候能好起来。
    Linux内核源码真是个好东西
    命宫——天机化忌
    bzoj1024[SCOI2009]生日快乐
    bzoj2561最小生成树
    bzoj2423[HAOI2010]最长公共子序列
    bzoj2705[SDOI2012]Longge的问题
  • 原文地址:https://www.cnblogs.com/Jie-Fei/p/9152757.html
Copyright © 2011-2022 走看看