VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 852|回复: 3

帮我改个输入方式

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-3-10 12:00:02 | 显示全部楼层 |阅读模式
找了一个大数的程序,分析了一下,想把输入改成键盘输入,试了几种方法没成功,没思路了,可能是程序没看懂,哪位帮我改改:
hugeint.h文件
#include<iostream.h>
class hugeint
{
public:
    hugeint(int);
    hugeint(long);
    hugeint(hugeint&);
    ~hugeint();
    inline long getsize(){return size;};
    inline int elem(long index){return data[index];};
    hugeint& operator = (char*);
    hugeint& operator = (hugeint&);   
protected:
    void inverse();
    void clear();
    int inc();
    int *data;
    long size;
//friends:
    friend ostream& operator << (ostream&,hugeint&);
    friend hugeint operator + (hugeint&,hugeint&);
    friend hugeint operator - (hugeint&,hugeint&);
    friend hugeint operator * (hugeint&,hugeint&);
    friend hugeint operator / (hugeint&,hugeint&);
    friend hugeint operator % (hugeint&,hugeint&);
    friend int add(hugeint&,hugeint&,int,int bitm=0);
    friend int mul(hugeint&,int);
    friend int div(hugeint&,hugeint&,hugeint&,hugeint&);
};
hugeint.cpp文件
#include<string.h>
#include<iomanip.h>
#include "hugeint.h"
#define ERRORMSG "Over Flow!"
//public:
hugeint::hugeint(int n)
{
    size=(long)n/4;
    data=new int[size];
    for(long i=0;i<size;++i)data[i]=0;
}
hugeint::hugeint(long n)
{
    size=n/4;
    data=new int[size];
    for(long i=0;i<size;++i)data[i]=0;
}
hugeint::hugeint(hugeint& a)
{
    size=a.getsize();
    data=new int[size];
    for(long i=0;i<size;++i)data[i]=a.elem(i);
}
hugeint::~hugeint()
{
    delete[]data;
}
//protected:

void hugeint::inverse()
{
    for(long i=0;i<size;++i)data[i]=9999-data[i];
}
void hugeint::clear()
{
    for(long i=0;i<size;++i)data[i]=0;
}
int hugeint::inc()
{
    int s=1;
    for(long i=0;s&&i<size;++i)
    {
        int t=data[i]+s;
        data[i]=t%10000;
        s=t/10000;
    }
    if(s)return -1;
    return 0;
}
//friends:
ostream& operator <<(ostream& out,hugeint& a)
{
    int *p=a.data+a.size-1;
    while(!*p)--p;
    out<<*p--;
    while(p>(a.data-1))
        out<<setw(4)<<setfill('0')<<*p--;
    return out;
}
hugeint& hugeint::operator = (char *str)
{
    long len=strlen(str),count=0;
    if(len>(size<<2))return *this;
    char *p=str+len-1;
    int t,i;
    while(1)
    {
        if((p-str)<4)break;
        t=0;
        char *ph=p-3;
        for(int i=0;i<4;++i)
        {
            t*=10;
            t+=ph[i]-'0';
        }
        data[count++]=t;
        p-=4;
    }
    t=0;
    for(i=0;i<=p-str;++i)
    {
        t*=10;
        t+=str[i]-'0';
    }
    data[count]=t;
    return *this;
}
hugeint& hugeint::operator = (hugeint& a)
{
    if(size!=a.getsize())return *this;
    for(long i=0;i<size;++i)data[i]=a.elem(i);
    return *this;
}
hugeint operator +(hugeint& a,hugeint& b)
{
    hugeint temp=a;
    if(add(temp,b,0))
        cerr<<ERRORMSG<<endl;
    return temp;
}
hugeint operator -(hugeint& a,hugeint& b)
{
    hugeint temp1=a,temp2=b;
    temp2.inverse();
    add(temp1,temp2,1);
    return temp1;
}
hugeint operator *(hugeint& a,hugeint& b)
{
    hugeint temp1=a,temp2=temp1;
    temp1.clear();
    for(long i=0;i<b.size;++i)
    {
        temp2=a;
        mul(temp2,b.data[i]);
        add(temp1,temp2,0,i);
    }
    return temp1;
}
hugeint operator /(hugeint& a,hugeint& b)
{
    hugeint stemp=a,rtemp=a;
    if(div(a,b,stemp,rtemp))
        cerr<<ERRORMSG<<endl;
    return stemp;
}
hugeint operator %(hugeint& a,hugeint& b)
{
    hugeint stemp=a,rtemp=a;
    if(div(a,b,stemp,rtemp))
        cerr<<ERRORMSG<<endl;
    return rtemp;
}
int add(hugeint& a,hugeint& b,int s,int bitm)
{
    long size;
    if((size=a.size)!=b.size)return -2;
    for(long i=bitm;i<size;++i)
    {
        int t=a.data[i]+b.data[i-bitm]+s;
        a.data[i]=t%10000;
        s=t/10000;
    }
    if(s)return -1;
    return 0;
}
int mul(hugeint& a,int n)
{
    int s=0;
    for(long i=0;i<a.size;++i)
    {
        long t=a.data[i]*n+s;
        a.data[i]=t%10000;
        s=t/10000;
    }
    if(s)return -1;
    return 0;
}
int div(hugeint& a,hugeint& b,hugeint& s,hugeint& r)//s=a/b,r=a%b
{
    hugeint temp1=a,temp2=b,temp3=a;
    s.clear();
    while(1)
    {
        temp2=b;
        temp2.inverse();
        temp3=temp1;
        if(!add(temp1,temp2,1))break;
        if(s.inc())return -1;
    }
    r=temp3;
    return 0;
}
main.cpp文件
#include "hugeint.h"
#define N 1000
void main()
{
    hugeint a(N);
    hugeint b=a,c=a;
    a="300000000";
    b="123432543";
    cout<<a+b<<endl
        <<a-b<<endl
        <<a*b<<endl
        <<a/b<<endl
        <<a%b<<endl;
}
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2021-3-10 13:30:01 | 显示全部楼层
重载operator>>
回复

使用道具 举报

0

主题

49

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2021-3-10 13:45:01 | 显示全部楼层
friend istream& operator >> (istream& in,hugeint& hint)
{
char temp[100];
in>>temp;
hint = temp;
return in;
}
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2021-3-10 14:45:01 | 显示全部楼层
利用楼上的代码
给个全的
为了方便都弄到一个文件里^-^
//hugeint.h文件
#include<iostream.h>
class hugeint
{
public:
        hugeint(int);
        hugeint(long);
        hugeint(hugeint&);
        ~hugeint();
        inline long getsize(){return size;};
        inline int elem(long index){return data[index];};
        hugeint& operator = (char*);
        hugeint& operator = (hugeint&);
protected:
        void inverse();
        void clear();
        int inc();
        int *data;
        long size;
        //friends:
        friend ostream& operator << (ostream&,hugeint&);
        friend istream& operator >> (istream& in,hugeint& hint);
        friend hugeint operator + (hugeint&,hugeint&);
        friend hugeint operator - (hugeint&,hugeint&);
        friend hugeint operator * (hugeint&,hugeint&);
        friend hugeint operator / (hugeint&,hugeint&);
        friend hugeint operator % (hugeint&,hugeint&);
        friend int add(hugeint&,hugeint&,int,int bitm=0);
        friend int mul(hugeint&,int);
        friend int div(hugeint&,hugeint&,hugeint&,hugeint&);
};
//hugeint.cpp文件
#include<string.h>
#include<iomanip.h>
//#include "hugeint.h"
#define ERRORMSG "Over Flow!"
//public:
hugeint::hugeint(int n)
{
        size=(long)n/4;
        data=new int[size];
        for(long i=0;i<size;++i)data[i]=0;
}
hugeint::hugeint(long n)
{
        size=n/4;
        data=new int[size];
        for(long i=0;i<size;++i)data[i]=0;
}
hugeint::hugeint(hugeint& a)
{
        size=a.getsize();
        data=new int[size];
        for(long i=0;i<size;++i)data[i]=a.elem(i);
}
hugeint::~hugeint()
{
        delete[]data;
}
//protected:

void hugeint::inverse()
{
        for(long i=0;i<size;++i)data[i]=9999-data[i];
}
void hugeint::clear()
{
        for(long i=0;i<size;++i)data[i]=0;
}
int hugeint::inc()
{
        int s=1;
        for(long i=0;s&&i<size;++i)
        {
                int t=data[i]+s;
                data[i]=t%10000;
                s=t/10000;
        }
        if(s)return -1;
        return 0;
}
//friends:
ostream& operator <<(ostream& out,hugeint& a)
{
        int *p=a.data+a.size-1;
        while(!*p)--p;
        out<<*p--;
        while(p>(a.data-1))
                out<<setw(4)<<setfill('0')<<*p--;
        return out;
}
//重载>>
istream& operator >> (istream& in,hugeint& hint)
{
char temp[100];
in>>temp;
hint = temp;
return in;
}

hugeint& hugeint::operator = (char *str)
{
        long len=strlen(str),count=0;
        if(len>(size<<2))return *this;
        char *p=str+len-1;
        int t,i;
        while(1)
        {
                if((p-str)<4)break;
                t=0;
                char *ph=p-3;
                for(int i=0;i<4;++i)
                {
                        t*=10;
                        t+=ph[i]-'0';
                }
                data[count++]=t;
                p-=4;
        }
        t=0;
        for(i=0;i<=p-str;++i)
        {
                t*=10;
                t+=str[i]-'0';
        }
        data[count]=t;
        return *this;
}
hugeint& hugeint::operator = (hugeint& a)
{
        if(size!=a.getsize())return *this;
        for(long i=0;i<size;++i)data[i]=a.elem(i);
        return *this;
}
hugeint operator +(hugeint& a,hugeint& b)
{
        hugeint temp=a;
        if(add(temp,b,0))
                cerr<<ERRORMSG<<endl;
        return temp;
}
hugeint operator -(hugeint& a,hugeint& b)
{
        hugeint temp1=a,temp2=b;
        temp2.inverse();
        add(temp1,temp2,1);
        return temp1;
}
hugeint operator *(hugeint& a,hugeint& b)
{
        hugeint temp1=a,temp2=temp1;
        temp1.clear();
        for(long i=0;i<b.size;++i)
        {
                temp2=a;
                mul(temp2,b.data[i]);
                add(temp1,temp2,0,i);
        }
        return temp1;
}
hugeint operator /(hugeint& a,hugeint& b)
{
        hugeint stemp=a,rtemp=a;
        if(div(a,b,stemp,rtemp))
                cerr<<ERRORMSG<<endl;
        return stemp;
}
hugeint operator %(hugeint& a,hugeint& b)
{
        hugeint stemp=a,rtemp=a;
        if(div(a,b,stemp,rtemp))
                cerr<<ERRORMSG<<endl;
        return rtemp;
}
int add(hugeint& a,hugeint& b,int s,int bitm)
{
        long size;
        if((size=a.size)!=b.size)return -2;
        for(long i=bitm;i<size;++i)
        {
                int t=a.data[i]+b.data[i-bitm]+s;
                a.data[i]=t%10000;
                s=t/10000;
        }
        if(s)return -1;
        return 0;
}
int mul(hugeint& a,int n)
{
        int s=0;
        for(long i=0;i<a.size;++i)
        {
                long t=a.data[i]*n+s;
                a.data[i]=t%10000;
                s=t/10000;
        }
        if(s)return -1;
        return 0;
}
int div(hugeint& a,hugeint& b,hugeint& s,hugeint& r)//s=a/b,r=a%b
{
        hugeint temp1=a,temp2=b,temp3=a;
        s.clear();
        while(1)
        {
                temp2=b;
                temp2.inverse();
                temp3=temp1;
                if(!add(temp1,temp2,1))break;
                if(s.inc())return -1;
        }
        r=temp3;
        return 0;
}
//main.cpp文件
//#include "hugeint.h"
#define N 1000
void main()
{

        hugeint a(N);

        hugeint b=a,c=a;
        //a="300000000";
        //b="123432543";
        cout<<"enter a"<<endl;
        cin>>a;
        cout<<"enter b"<<endl;
        cin>>b;

        cout<<a+b<<endl
                <<a-b<<endl
                <<a*b<<endl
                <<a/b<<endl
                <<a%b<<endl;
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表