加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

UVA 10494 If We Were a Child Again(大数)

发布时间:2020-12-14 02:12:59 所属栏目:大数据 来源:网络整理
导读:E -? If We Were a Child Again Time Limit: 3000 MS????? Memory Limit: 0 KB????? 64bit IO Format: %lld %llu Submit? Status? Practice? UVA 10494 Appoint description:? Luke? (2014-01-22) System Crawler? (2015-11-11) Description ? ?Oooooooooooo
E -?If We Were a Child Again
Time Limit:3000MS?????Memory Limit:0KB?????64bit IO Format:%lld & %llu
Submit? Status? Practice? UVA 10494
Appoint description:?

Description

?

?Oooooooooooooooh!

If I could do the easy mathematics like my school days!!

I can guarantee,that?I?d?not make any mistake this time!!?

Says a smart university student!!

But his teacher even smarter ???Ok!?I?d?assign you such projects in your software lab.?Don?t?be so sad.?

?Really!!? - the students feels happy. And he feels so happy that he cannot see the smile in his?teacher?s?face.

The Problem

The first project for the poor student was to make a calculator that can just perform the basic arithmetic operations.

But like many other university students he?doesn?t?like to do any project by himself. He just wants to collect programs from here and there. As you are a friend of him,he asks you to write the program. But,you are also intelligent enough to tackle this kind of people.?You agreed to write only the (integer) division and mod (% in C/C++) operations for him.

?

Input

Input is a sequence of lines. Each line will contain an input number. One or more spaces. A sign (division or mod). Again spaces. And another input number. Both the input numbers are non-negative integer. The first one may be arbitrarily long. The second number?n?will be in the range (0 < n < 231).

Output

A line for each input,each containing an integer. See the sample input and output. Output should not contain any extra space.

Sample Input

110 / 100

99 % 10

2147483647 / 2147483647

2147483646 % 2147483647

Sample Output

1

9

1

2147483646


代码:

    #include<iostream>
    #include<string>
    #include<iomanip>
    #include<algorithm>
    #include<string.h>
    #include<stdio.h>
    using namespace std;

    #define MAXN 9999
    #define MAXSIZE 300
    #define DLEN 4

    class BigNum
    {
    private:
        long long  a[500];    //可以控制大数的位数
        long long  len;       //大数长度
    public:
        BigNum(){ len = 1;memset(a,sizeof(a)); }   //构造函数
        BigNum(const int);       //将一个int类型的变量转化为大数
        BigNum(const char*);     //将一个字符串类型的变量转化为大数
        BigNum(const BigNum &);  //拷贝构造函数
        BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算

        friend istream& operator>>(istream&,BigNum&);   //重载输入运算符
        friend ostream& operator<<(ostream&,BigNum&);   //重载输出运算符

        BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算
        BigNum operator-(const BigNum &) const;   //重载减法运算符,两个大数之间的相减运算
        BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算
        BigNum operator/(const int   &) const;    //重载除法运算符,大数对一个整数进行相除运算

        BigNum operator^(const int  &) const;    //大数的n次方运算
        long long     operator%(const int  &) const;    //大数对一个int类型的变量进行取模运算
        bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
        bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较

        void print();       //输出大数
    };
    BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
    {
        long long c,d = b;
        len = 0;
        memset(a,sizeof(a));
        while(d > MAXN)
        {
            c = d - (d / (MAXN + 1)) * (MAXN + 1);
            d = d / (MAXN + 1);
            a[len++] = c;
        }
        a[len++] = d;
    }
    BigNum::BigNum(const char*s)     //将一个字符串类型的变量转化为大数
    {
        long long t,k,index,l,i;
        memset(a,sizeof(a));
        l=strlen(s);
        len=l/DLEN;
        if(l%DLEN)
            len++;
        index=0;
        for(i=l-1;i>=0;i-=DLEN)
        {
            t=0;
            k=i-DLEN+1;
            if(k<0)
                k=0;
            for(int j=k;j<=i;j++)
                t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
    {
        long long i;
        memset(a,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = T.a[i];
    }
    BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
    {
        long  i;
        len = n.len;
        memset(a,sizeof(a));
        for(i = 0 ; i < len ; i++)
            a[i] = n.a[i];
        return *this;
    }
    istream& operator>>(istream & in,BigNum & b)   //重载输入运算符
    {
        char ch[MAXSIZE*4];
        long long i = -1;
        in>>ch;
        long long  l=strlen(ch);
        long long count=0,sum=0;
        for(i=l-1;i>=0;)
        {
            sum = 0;
            long long t=1;
            for(int j=0;j<4&&i>=0;j++,i--,t*=10)
            {
                sum+=(ch[i]-'0')*t;
            }
            b.a[count]=sum;
            count++;
        }
        b.len =count++;
        return in;

    }
    ostream& operator<<(ostream& out,BigNum& b)   //重载输出运算符
    {
        long long i;
        cout << b.a[b.len - 1];
        for(i = b.len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << b.a[i];
        }
        return out;
    }

    BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
    {
        BigNum t(*this);
        long long i,big;      //位数
        big = T.len > len ? T.len : len;
        for(i = 0 ; i < big ; i++)
        {
            t.a[i] +=T.a[i];
            if(t.a[i] > MAXN)
            {
                t.a[i + 1]++;
                t.a[i] -=MAXN+1;
            }
        }
        if(t.a[big] != 0)
            t.len = big + 1;
        else
            t.len = big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum & T) const   //两个大数之间的相减运算
    {
        long long i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T)
        {
            t1=*this;
            t2=T;
            flag=0;
        }
        else
        {
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i = 0 ; i < big ; i++)
        {
            if(t1.a[i] < t2.a[i])
            {
                j = i + 1;
                while(t1.a[j] == 0)
                    j++;
                t1.a[j--]--;
                while(j > i)
                    t1.a[j--] += MAXN;
                t1.a[i] += MAXN + 1 - t2.a[i];
            }
            else
                t1.a[i] -= t2.a[i];
        }
        t1.len = big;
        while(t1.a[t1.len - 1] == 0 && t1.len > 1)
        {
            t1.len--;
            big--;
        }
        if(flag)
            t1.a[big-1]=0-t1.a[big-1];
        return t1;
    }

    BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
    {
        BigNum ret;
        long long  i,up;
        long long temp,temp1;
        for(i = 0 ; i < len ; i++)
        {
            up = 0;
            for(j = 0 ; j < T.len ; j++)
            {
                temp = a[i] * T.a[j] + ret.a[i + j] + up;
                if(temp > MAXN)
                {
                    temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
                    up = temp / (MAXN + 1);
                    ret.a[i + j] = temp1;
                }
                else
                {
                    up = 0;
                    ret.a[i + j] = temp;
                }
            }
            if(up != 0)
                ret.a[i + j] = up;
        }
        ret.len = i + j;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    BigNum BigNum::operator/(const int & b) const   //大数对一个整数进行相除运算
    {
        BigNum ret;
        long long i,down = 0;
        for(i = len - 1 ; i >= 0 ; i--)
        {
            ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
            down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
        }
        ret.len = len;
        while(ret.a[ret.len - 1] == 0 && ret.len > 1)
            ret.len--;
        return ret;
    }
    long long BigNum::operator %(const int & b) const    //大数对一个int类型的变量进行取模运算
    {
        long long  i,d=0;
        for (i = len-1; i>=0; i--)
        {
            d = ((d * (MAXN+1))% b + a[i])% b;
        }
        return d;
    }
    BigNum BigNum::operator^(const int & n) const    //大数的n次方运算
    {
        BigNum t,ret(1);
        long long i;
        if(n<0)
            exit(-1);
        if(n==0)
            return 1;
        if(n==1)
            return *this;
        long long m=n;
        while(m>1)
        {
            t=*this;
            for( i=1;i<<1<=m;i<<=1)
            {
                t=t*t;
            }
            m-=i;
            ret=ret*t;
            if(m==1)
                ret=ret*(*this);
        }
        return ret;
    }
    bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
    {
        long long  ln;
        if(len > T.len)
            return true;
        else if(len == T.len)
        {
            ln = len - 1;
            while(a[ln] == T.a[ln] && ln >= 0)
                ln--;
            if(ln >= 0 && a[ln] > T.a[ln])
                return true;
            else
                return false;
        }
        else
            return false;
    }
    bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
    {
        BigNum b(t);
        return *this>b;
    }

    void BigNum::print()    //输出大数
    {
        long long i;
        cout << a[len - 1];
        for(i = len - 2 ; i >= 0 ; i--)
        {
            cout.width(DLEN);
            cout.fill('0');
            cout << a[i];
        }
       // printf("*");
        cout << endl;
    }
    int main(void)
    {
        long long i,n,a;
        char s[10];
        BigNum x,y,z;      //定义大数的对象数组
        while(cin>>x)
        {
           scanf("%s",s);
           cin>>a;
           if(s[0]=='/'){
            z=x/a;
           }
           if(s[0]=='%'){
            z=x%a;
           }
            z.print();
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读