大数的加减乘除

最近学运算符重载有题是关于大数的加减乘除的,先占个坑,一会填
题目
参考1
参考1除法效率吓哭我了,下面直接贴出他的代码
我尝试改他的除法没有改成功,我不会放弃的,先放一会~~~

#include<iostream>
#include<cstring>
using namespace std;
const int MAXLEN = 205;
int i;
class Integer{
private:
    int is_neg;
    int len;
    int s[MAXLEN];
    char str[MAXLEN];
public:
    Integer(const char * string = ""){
        memset(s,0,MAXLEN*sizeof(int));
        memset(str,0,MAXLEN*sizeof(char));
        strcpy(str,string);
        is_neg = 0;
        len = strlen(str);
        for(i = 0;i < len;i++)
            s[i] = int(str[len - 1 - i]) - 48;
    }
    Integer &operator=(const Integer & oth){
        if(this == &oth) return *this;
        memset(s,0,MAXLEN*sizeof(int));
        memset(str,0,MAXLEN*sizeof(char));
        is_neg = oth.is_neg;
        len = oth.len;
        for(i = 0;i < oth.len;i++)
            s[i] = oth.s[i];
        strcpy(str,oth.str);
        return *this;
    }
    bool operator==(const Integer & oth){
            if(this == &oth) return true;
            bool ret = true;
            if(len != oth.len || is_neg != oth.is_neg) ret = false;
            if(strcmp(str,oth.str)) ret = false;
            for(int i = 0;i < oth.len;i++){
                if(s[i] != oth.s[i]) ret = false;
            }
            return ret;
        }
        bool operator!=(const Integer & oth){
            return !(*this == oth);
        }
    Integer operator+(const Integer & oth){
        Integer c;
        int length = len >= oth.len ? len : oth.len;
        length += 1;
        c.len = length;
        for(i = 0;i < c.len;i++){
            c.s[i] += s[i] + oth.s[i];
            c.s[i + 1] += c.s[i] / 10;
            c.s[i] = c.s[i] % 10;
        }

        if((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--;
            int k = 0;
            for(i = c.len - 1;i >= 0;i--){
                c.str[k++] = (char)(c.s[i] + 48);
            }
            return c;
        }
        Integer operator-(const Integer &oth){
            Integer c;
            int flag = 0;
            if(len > oth.len) flag = 1;
            else if(len < oth.len) flag = -1;
            else flag = strcmp(str,oth.str);

            if(flag >= 0){
                c.len = len;
                int borrow = 0;
                for(i = 0;i < c.len;i++){
                    c.s[i] += s[i] - oth.s[i];
                    if(borrow) c.s[i] -= 1;
                    if(c.s[i] < 0){
                        c.s[i] += 10;
                        borrow = 1;
                    }else
                        borrow = 0;
                }
                while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--;
            }else{
                c.is_neg = 1;
                c.len = oth.len;
                int borrow = 0;
                for(i = 0;i < c.len;i++){
                    c.s[i] += oth.s[i] - s[i];
                    if(borrow) c.s[i] -= 1;
                    if(c.s[i] < 0){
                        c.s[i] += 10;
                        borrow = 1;
                    }else
                        borrow = 0;
                }
                while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--;
            }
            int k = 0;
            for(i = c.len - 1;i >= 0;i--){
                c.str[k++] = (char)(c.s[i] + 48);
            }
            return c;
        }
        Integer operator*(const Integer & oth){
            Integer c;
            c.len = len + oth.len + 1;
            for(i = 0;i < len;i++){
                for(int j = 0;j < oth.len;j++){
                    c.s[i + j] += s[i] * oth.s[j];
                    c.s[i + j + 1] += c.s[i + j] / 10;
                    c.s[i + j] = c.s[i + j] % 10;
                }
            }
            while((c.len > 1)&&(c.s[c.len - 1] == 0)) c.len--;
            int k = 0;
            for(i = c.len - 1;i >= 0;i--){
                c.str[k++] = (char)(c.s[i] + 48);
            }
            return c;
        }
        Integer operator/(const Integer &oth){
            Integer c("0");
            int flag = 0;

            if(len > oth.len) flag = 1;
            else if(len < oth.len) flag = -1;
            else flag = strcmp(str,oth.str);

            Integer one("1");
            Integer zero("0");
            Integer t;
            if(oth.len == 1&&oth.s[0] == 1) return *this;
            if(flag >= 0){
                while(this->is_neg == 0&&*this != zero){
                    t = *this - oth;
                    *this = t;
                    c = c + one;
                }
            }else{
                int k = 0;
                for(i = c.len - 1;i >= 0;i--){
                    c.str[k++] = (char)(c.s[i] + 48);
                }
                return c;
            }
            int k = 0;
            for(i = c.len - 1;i >= 0;i--){
                c.str[k++] = (char)(c.s[i] + 48);
            }
            return c;
        }
        friend ostream & operator<<(ostream & out,const Integer & oth){
            if(oth.is_neg) out << "-";
            for(int k = oth.len - 1;k >= 0;k--)
                out << oth.s[k];
            return out;
        }
};
int main(){
    char ch;
    Integer c;
    char s1[MAXLEN],s2[MAXLEN];

    cin >> s1;
    cin >> ch;
    cin >> s2;

    Integer a(s1);
    Integer b(s2);


    switch(ch){
        case '+':c = a + b;cout << c << endl;break;
        case '*':c = a * b;cout << c << endl;break;
        case '-':c = a - b;cout << c << endl;break;
        case '/':c = a / b;cout << c << endl;break;
    }
    return 0;
}

参考2
额,参考二直接看吧
参考3
参考3后来看见的,好像不错
参考4
现在才看见,ORZ,方法都大同小异

下面是我改别人的代码之后AC的,哭~~~
先占个坑,
相关链接

 #include <iostream>  
 #include <string>  
 #include <cstring>  
 #include <vector>  
 #include <algorithm>  
    using namespace std; 
   void JIA(string s1,string s2)  
    {       
            string sp;
            if(s1.length() > s2.length()){
                sp = s1;
                s1 = s2;
                s2 = sp;
            }
            string s(1000,'0');  
            reverse(s1.begin(),s1.end());  
            reverse(s2.begin(),s2.end());  
            for(int j=0;j<s1.length();j++)  
            s[j]=s1[j];  
            int temp=0;  
            for(int k=0;k<s2.length();k++)  
            {  
               temp+=s[k]-48+s2[k]-48;  
               s[k]=temp%10+'0';  
               temp/=10;          
            }  
            s[s2.length()]=s[s2.length()]-48+temp+48;   
            reverse(s.begin(),s.end());  
            reverse(s1.begin(),s1.end());  
            reverse(s2.begin(),s2.end());  
            cout<<s.substr(s.find_first_not_of('0'))<<endl;  
    } 
    int strComp(string &s1,string &s2)  
    {  
        int len1=s1.length();  
        int len2=s2.length();  
        if(len1>len2)  
        return 0;  
        else if(len1<len2)  
        return 1;  
        else{  
            if(s1>=s2)  
            return 0;  
            else  
            return 1;  
        }  
    }  
    void JIAN(string s1,string s2)  
    {   
            string s(10000,'0');  
            bool fgEx=true;  
            if(strComp(s1,s2)==1)  
            {  
                string temp;  
                temp=s1;  
                s1=s2;  
                s2=temp;  
                fgEx=false;  
            }  
            if(s1==s2)  
            {  
                cout<<"0"<<endl;  
                return;  
            }  
            reverse(s1.begin(),s1.end());  
            reverse(s2.begin(),s2.end());  
            for(int i=0;i<s1.length();i++)  
            s[i]=s1[i];  
            for(int i=0;i<s2.length();i++)  
            {  
                if(s[i]>=s2[i])  
                s[i]=s[i]-'0'-(s2[i]-'0')+'0';  
                else{  
                    s[i+1]=s[i+1]-'0'-1+'0';  
                    s[i]=s[i]-'0'+10-(s2[i]-'0')+'0';  
                }  
            }  
            if(fgEx==false)  
            {  
                reverse(s2.begin(),s2.end());  
                reverse(s1.begin(),s1.end());  
                reverse(s.begin(),s.end());  
                cout<<"-"<<s.substr(s.find_first_not_of('0'))<<endl;  
            }  
            else  
            {  
                reverse(s1.begin(),s1.end());  
                reverse(s2.begin(),s2.end());  
                reverse(s.begin(),s.end());  
                cout<<s.substr(s.find_first_not_of('0'))<<endl;  
            }  

    }     
    void CHENG(string s1,string s2)  
    {  
        string s(1000,'0');

            reverse(s1.begin(),s1.end());  
            reverse(s2.begin(),s2.end());  
            for(int i=0;i<s1.length();i++)  
            for(int j=0;j<s2.length();j++)  
            {  
                int temp=(s1[i]-'0')*(s2[j]-'0');  
                s[i+j+1]=s[i+j+1]-'0'+(s[i+j]-'0'+temp)/10+'0';  
                s[i+j]=(s[i+j]-'0'+temp)%10+'0';  
            }  
            reverse(s.begin(),s.end());  
            if(s.find_first_not_of('0')==string::npos)  
            cout<<"0"<<endl;  
            else  
            cout<<s.substr(s.find_first_not_of('0'))<<endl;     
    }  

string Sub(string s1,string s2)  
{  
        if(strComp(s1,s2)==1)  
        return "-1";  
        reverse(s1.begin(),s1.end());  
        reverse(s2.begin(),s2.end());  
        string s(1000,'0');  
        for(int i=0;i<s1.length();i++)  
        s[i]=s1[i];  
        for(int i=0;i<s2.length();i++)  
        {  
            if(s[i]>=s2[i])  
            s[i]=s[i]-'0'-(s2[i]-'0')+'0';  
            else{  
                s[i+1]=s[i+1]-'0'-1+'0';  
                s[i]=s[i]-'0'+10-(s2[i]-'0')+'0';  
            }  
        }  
        reverse(s.begin(),s.end());  
        if(s.find_first_not_of('0')==string::npos)  
        return "0";  
        else  
        return s.substr(s.find_first_not_of('0'));  
}  
void CHU(string s1,string s2)  
{  

        string s(1000,'0');  
        if(strComp(s1,s2)==1)  
        {  
          cout<<"0"<<endl;  
          return;  
        }  
        int len1=s1.length();  
        int len2=s2.length();  
        int dis=len1-len2;  
        for(int i=0;i<dis;i++)  
        s2+='0';  
        string ans(1000,'0');  
        while(dis>=0)  
        {  
              int sum=0;  
              string temp;  
              while((temp=Sub(s1,s2))!="-1")  
              {  
                  sum++;  
                  s1=temp;  
              }   
              ans[ans.length()-dis-1]=sum+'0';  
              dis--;  
              s2=s2.substr(0,len2+dis);  
        }  
        if(ans.find_first_not_of('0')==string::npos)  
        cout<<"0"<<endl;  
        else{  
        string res=ans.substr(ans.find_first_not_of('0'));  
        cout<<res<<endl;  
        }  
}  
int main(){
    string s1,s2;
    char ch;
    cin >> s1 >> ch >> s2;
    if(ch == '+') JIA(s1,s2);
    if(ch == '-') JIAN(s1,s2);
    if(ch == '*') CHENG(s1,s2);
    if(ch == '/') CHU(s1,s2);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值