#10082: 大數運算 WA line:8


clarkwkw (clark)


請問一下我的程序出了什麼問題? 一直卡在這個測資哼!懶得理你

請各位高手們幫忙。。。謝謝

 

 

 #include<iostream>
#include<sstream>
#include<cstring>
using namespace std;
int icmp(string s1, string s2){
    if(s1.size()>s2.size())
        return 0;
    else if(s1.size()<s2.size())
        return 1;
    int l = s1.size();
    for(int i = 0; i<l; i++)
        if(s1[i]>s2[i])
            return 0;
        else if(s1[i]<s2[i])
            return 1;
    return -1;
}
void swapS(string *s1, string *s2){
    string tmp = *s1;
    *s1 = *s2;
    *s2 = tmp;
}
string cut0(string s){
    int l0, l = s.size(), i;
    for(l0 = 0; l0<l && s[l0] == '0'; l0++);
    for(i = 0; i<l-l0+1; i++)
        s[i] = s[i+l0];
    for(i = 1; i<l && s[i]>='0' && s[i]<='9'; i++);
    s.resize(i);
    return s;
}
string add(string i1, string i2){
    string result = "";
    int l1, l2;
    if(i1.size()<i2.size())
        swapS(&i1, &i2);
    l1 = i1.size();
    l2 = i2.size();
    int isIn = 0;
    for(int i = 0; i<l1; i++){
        int tmp;
        if(l2 - i - 1 >= 0)
            tmp = (i1[l1-i-1] + i2[l2-i-1])-2*'0' + isIn;
        else
            tmp = i1[l1-i-1]-'0' + isIn;
        isIn = tmp/10;
        tmp %= 10;
        result = string(1, (char)(tmp+'0'))+result;
    }
    if(isIn)result = "1"+result;
    return result;
}
string subtract(string i1, string i2){
    bool isMinus = false;
    if(i2.size()>i1.size() || (i2.size() == i1.size() && i1[0]<i2[0])){
        swapS(&i1, &i2);
        isMinus = true;
    }
    string result = "";
    int l1 = i1.size(), l2 = i2.size();        
    int isIn = 0;
    for(int i = 0; i<l1; i++){
        int tmp;
        if(l2 - i - 1>=0)
            tmp = i1[l1-i-1] - i2[l2-i-1] - isIn;
        else
            tmp = i1[l1-i-1] - isIn - '0';
        isIn = tmp>=0?0:1;
        if(tmp<0)tmp+=10;
        result = string(1, (char)(tmp+'0'))+result;
    }
    result = cut0(result);
    if(isMinus)result = "-"+result;
    return result;
}
string smTimes(string i1, char i2){
    string result = "";
    int l = i1.size(), isIn = 0;
    i2 -='0';
    for(int i = 0; i<l; i++){
        int tmp = (i1[l-i-1]-'0')*i2+isIn;
        isIn = tmp/10;
        tmp %= 10;
        result = string(1, (char)(tmp+'0'))+result;
    }
    if(isIn) result = string(1, (char)(isIn+'0'))+result;
    return result;
}
string times(string i1, string i2){
    if(i2.size()>i1.size())
        swapS(&i1, &i2);
    string result = "0";
    int l1 = i1.size(), l2 = i2.size();
    for(int i = 0; i<l2; i++){
        string tmp;
        tmp = smTimes(i1, i2[l2-i-1]);
        for(int j = 0; j<i; j++)
            tmp = tmp+"0";
        result = add(tmp, result);
    }
    return result;
}
string divide(string i1, string i2){
    int p = icmp(i1, i2);
    if(p == 1)
        return "0";
    else if(p == -1)
        return "1";
    int l1 = i1.size(), l2 = i2.size(), resultl = 0;
    string result = "";
    while(icmp(i1, i2) <= 0){
        string mQ = i2;
        for(int i = 0; i<l1-l2-resultl; i++){
            string tmp = "";
            for(int j = 0; j<l1-l2-resultl-i; j++)
                tmp += "0";
            if(icmp(i1, mQ+tmp) <= 0){
                mQ += tmp;
                break;
            }
        }
        int q = 0;
        int tmp2;
        while(icmp(i1, mQ) <= 0){
            i1 = subtract(i1, mQ);
            q++;
        }
        result += string(1, (char) (q+'0'));
        resultl++;
    }
    return result;
}
int main(){
    string i1, i2, result;
    char op;
    while(cin>>i1>>op>>i2){
        if(op == '+')
            result = add(i1, i2);
        else if(op == '-')
            result = subtract(i1, i2);
        else if(op == '*')
            result = times(i1, i2);
        else if(op == '/')
            result = divide(i1, i2);

    cout<<result<<endl;
    }

    return 0;
}