代码AC不了大数除法。这是怎么回事啊?(语言-c++)


#include<iostream>
using namespace std;

void deleteZero(string& str);
bool checkString(string a, string b);
int check(string a, string b);
string operator-(string a, string b);

int main()
{
    string a, b;
    while (cin >> a >> b) {
        string ans = "";
        deleteZero(a);
        deleteZero(b);
        if (check(a, b) == 1) {
            cout << 1 << endl;
            continue;
        }
        else if (check(a, b) == 2) {
            cout << 0 << endl;
            continue;
        }
        else {
            int len = b.length();
            string str = a.substr(0, len);
            //cout << "str = " << str << endl;
            for (int i = len; i <= a.length(); i++) {            //2376 24
                int count = 0;
                while (checkString(str, b)) {
                    str = str - b;
                    count++;
                }
                char ch = count + '0';
                ans = ans + ch;
                str = str + a[i];
            }
            deleteZero(ans);
            cout << ans << endl;

            //continue;
        }
    }

    return 0;
}

string operator-(string a, string b) {
    string ans = "";
    int lenOfa = a.length();
    int lenOfb = b.length();

    if (lenOfa > lenOfb) {
        for (int i = 0; i < lenOfa - lenOfb; i++) {
            b = '0' + b;
        }
    }
    else {
        for (int i = 0; i < lenOfb - lenOfa; i++) {
            a = '0' + a;
        }
    }

    int dq = 0;
    int len = a.length();

    for (int i = len - 1; i >= 0; i--) {
        int num = a[i] - b[i] - dq;
        if (num < 0) {
            dq = 1;
            num += 10;
        }
        else {
            dq = 0;
        }
        char ch = num + '0';
        ans = ch + ans;
    }
    deleteZero(ans);
    return ans;
}

void deleteZero(string& str) {
    int index = 0;
    while (str[index] == '0') index++;
    if (index == str.length())
        str.erase(0, index - 1);
    else str.erase(0, index);
}

int check(string a, string b) {
    if (a == b) { return 1; }
    else if (!checkString(a, b)) {
        return 2;
    }
    return 3;
}

bool checkString(string a, string b) {
    if (a.length() == b.length()) {
        return a >= b;
    }
    else if (a.length() < b.length()) {
        return false;
    }
    else {
        return true;
    }
}

你代码有什么问题吗?

下面是大数相减和相除的代码,:

#include <iostream>
#include <string>
using namespace std;

#define MAXNUM (int)300

//去除前面的0
void movePreZero(char c[])
{
    int i;
    while(c[0]=='0')
    {
        for(i=0;i<strlen(c)-1;i++)
            c[i]=c[i+1];
        c[strlen(c)-1] = 0;
    }
}


//显示字符串
void print(char c[])
{
    int i=0;
    int flag = 0;
    for (i=0;c[i]!='\0';i++)
    {
        if(c[i]!='0')
            flag = 1;
        if(flag)
            cout <<c[i];
        else
            cout << " ";
    }
    cout << endl;
}


//大数相减,成功返回1,a<b返回0
int bigSub(char a[],char b[],char c[])
{
    int i=0;
    int shift = 0,val;
    int l1 = strlen(a);
    int l2 = strlen(b);
    if(l1<l2) 
    {
        c[0]=0;
        return 0;
    }
    //b后移l1-l2位,并且前面补0
    for(i=l2-1;i>=0;i--)
        b[i+l1-l2] = b[i];
    for(i=0;i<l1-l2;i++)
        b[i] = '0';

    //逐位相减
    i = l1-1;
    c[l1] = 0;
    while(i>=0)
    {
        val = a[i]-b[i]-shift;
        if(val<0)
        {
            val += 10;
            shift = 1;
        }else
            shift = 0;
        c[i] = '0'+val;
        i--;
    }
    if(shift)
    {
        c[0] =0;
        return 0;
    }
    //去除前面的0
    movePreZero(c);
    //去除b前面的0
    movePreZero(b);
    //printf("%s",c);
    if(strlen(c)==0)
    {
        c[0] ='0'; //留1个0
        c[1] = 0;
    }
    return 1;
}
//大数相除 a/b
void bigdiv(char* a,char* b,char* c)
{
    int i,t=0;
    int index = 0;
    int flag = 0;
    int l1 =strlen(a);
    int l2 =strlen(b);
    char tmp[MAXNUM]={0};
    char sz[MAXNUM];
    strcpy(sz,a);
    sz[l2]=0;
    t = l2;
    while( t <= l1)
    {
        c[index] = 0;
        flag = 0;
        while(bigSub(sz,b,tmp))
        {
            if(c[index]==0)
                c[index] = '1';
            else
                c[index] += 1;
            flag = 1;
            strcpy(sz,tmp);
        }
        if(flag)
            index++;
        //sz后面增加a
        i = strlen(sz);
        sz[i] = a[t];
        sz[i+1]=0;
        //print(sz);
        t++;
    }
    c[index] = 0;
    movePreZero(c);
    if(strlen(c)==0)
    {
        c[0] ='0'; //留1个0
        c[1] = 0;
    }
    //printf("%s",c);
}



int main()
{
    char a[MAXNUM]={0},b[MAXNUM]={0},c[MAXNUM]={0};
    cin >> a >> b;
    bigdiv(a,b,c);
    print(c);
    return 0;
}