自己写的一个关于大整数类做除法的方法,有可以改进的地方吗(语言-c++)

网上的教程是真的看不懂#(泪) 所以自己捣鼓了一个,可以帮忙看看有没有可以改进的吗

**HugeInteger通过一个40个元素的整型数组储存大整数




//在进行除法之前,要先定义一个可以截取随机位置的函数,截取[i,j)
HugeInteger HugeInteger::cut(int i,int j)
{HugeInteger tem;int p=j-1;
for(int n=39;n>=40-j+i;n--,p--){tem.integer[n]=integer[p];}
return tem;};
HugeInteger HugeInteger::divide(HugeInteger & a) {int a_num=0;//取除数的长度while(a.integer[a_num]==0)
{a_num++;
if(a.integer[a_num]!=0)break;}
int a_n=40-a_num;int t_num=0;//取被除数的长度while(integer[t_num]==0)
{t_num++;
if(integer[t_num]!=0)break;}
int t_n=40-t_num;
int k=t_num+a_n-1;
int i=t_num;int divider;int j,m;
HugeInteger result,temp;HugeInteger dividee(*this);
for(;k<40;k++)
{divider=0; //先设商为0temp=dividee.cut(i,k+1); //截取从i到k+1 while(temp.isGreaterThanOrEqualTo(a)) //取商,大于等于
{divider++;temp=temp-a;}result.integer[k]=divider; //保存商for(j=k,m=39;j>=i;j--,m--) //更新被除数
{dividee.integer[j]=temp.integer[m];}
while(dividee.integer[i]==0) //这步很关键
{i++;}}
return result;}**


不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/175518
  • 除此之外, 这篇博客: 大数类中的 2.BigInteger类的常用方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    方法类型描述
    public BigInteger(String val)构造将一个字符串变为BigInteger类型的数据
    public BigInteger add(BigInteger val)普通加法计算
    public BigInteger subtract(BigInteger val)普通减法计算
    public BigInteger multiply(BigInteger val)普通乘法计算
    public BigInteger divide(BigInteger val)普通除法计算
    public BigInteger max(BigInteger val)普通返回两个大数字中的最大值
    public BigInteger min(BigInteger val)普通返回两个大数字中的最小值
    public BigInteger[] divideAndRemainder(BigInteger val)普通除法操作:数组的第一个元素为商,第二个元素为余数

    案例:使用BigInteger实现四则运算

    public class BigIntegerTestDemo {
        public static void main(String[] args){
            BigInteger bigIntegerNumber01 = new BigInteger("25");
            BigInteger bigIntegerNumber02 = new BigInteger("4");
            
            System.out.println("bigIntegerNumber01:" + bigIntegerNumber01);
            System.out.println("bigIntegerNumber02:" + bigIntegerNumber02);
            System.out.println("加法操作:" + bigIntegerNumber01.add(bigIntegerNumber02));
            System.out.println("减法操作:" + bigIntegerNumber01.subtract(bigIntegerNumber02));
            System.out.println("乘法操作:" + bigIntegerNumber01.multiply(bigIntegerNumber02));
            System.out.println("除法操作:" + bigIntegerNumber01.divide(bigIntegerNumber02));
            BigInteger[] result = bigIntegerNumber01.divideAndRemainder(bigIntegerNumber02);
            System.out.println("商:" + result[0] + ",余数:" + result[1]);
        }
    }
    
    /*
    输出结果:
    bigIntegerNumber01:25
    bigIntegerNumber02:4
    加法操作:29
    减法操作:21
    乘法操作:100
    除法操作:6
    商:6,余数:1
    */
    

    上述例子基于BigInteger类实现了基础四则运算,可以发现实例化BigInteger类对象时的数据类型为String,这样就可以不受数据类型长度的限制。



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

仅供参考:

#include <iostream>
#include <string>
using namespace std;
inline int compare(string str1,string str2) {//相等返回0,大于返回1,小于返回-1
         if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数
    else if (str1.size()<str2.size()) return -1;
    else                              return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {//高精度加法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        if (str2[0]=='-') {
            sign=-1;
            str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
        } else {
            str=SUB_INT(str2,str1.erase(0,1));
        }
    } else {
        if (str2[0]=='-') {
            str=SUB_INT(str1,str2.erase(0,1));
        } else { //把两个整数对齐,短整数前面加0补齐
            string::size_type L1,L2;
            int i;
            L1=str1.size();
            L2=str2.size();
            if (L1<L2) {
                for (i=1;i<=L2-L1;i++) str1="0"+str1;
            } else {
                for (i=1;i<=L1-L2;i++) str2="0"+str2;
            }
            int int1=0,int2=0; //int2 记录进位
            for (i=str1.size()-1;i>=0;i--) {
                int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
                int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
                str=char(int1+'0')+str;
            }
            if (int2!=0) str=char(int2+'0')+str;
        }
    }
    //运算后处理符号位
    if ((sign==-1)&&(str[0]!='0')) str="-"+str;
    return str;
}
string SUB_INT(string str1,string str2) {//高精度减法
    int sign=1; //sign 为符号位
    string str;
    int i,j;
    if (str2[0]=='-') {
        str=ADD_INT(str1,str2.erase(0,1));
    } else {
        int res=compare(str1,str2);
        if (res==0) return "0";
        if (res<0) {
            sign=-1;
            string temp =str1;
            str1=str2;
            str2=temp;
        }
        string::size_type tempint;
        tempint=str1.size()-str2.size();
        for (i=str2.size()-1;i>=0;i--) {
            if (str1[i+tempint]<str2[i]) {
                j=1;
                while (1) {//zhao4zhong1添加
                    if (str1[i+tempint-j]=='0') {
                        str1[i+tempint-j]='9';
                        j++;
                    } else {
                        str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
                        break;
                    }
                }
                str=char(str1[i+tempint]-str2[i]+':')+str;
            } else {
                str=char(str1[i+tempint]-str2[i]+'0')+str;
            }
        }
        for (i=tempint-1;i>=0;i--) str=str1[i]+str;
    }
    //去除结果中多余的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str ="-"+str;
    return str;
}
string MUL_INT(string str1,string str2) {//高精度乘法
    int sign=1; //sign 为符号位
    string str;
    if (str1[0]=='-') {
        sign*=-1;
        str1 =str1.erase(0,1);
    }
    if (str2[0]=='-') {
        sign*=-1;
        str2 =str2.erase(0,1);
    }
    int i,j;
    string::size_type L1,L2;
    L1=str1.size();
    L2=str2.size();
    for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式
        string tempstr;
        int int1=0,int2=0,int3=int(str2[i])-'0';
        if (int3!=0) {
            for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;
            for (j=L1-1;j>=0;j--) {
                int1=(int3*(int(str1[j])-'0')+int2)%10;
                int2=(int3*(int(str1[j])-'0')+int2)/10;
                tempstr=char(int1+'0')+tempstr;
            }
            if (int2!=0) tempstr=char(int2+'0')+tempstr;
        }
        str=ADD_INT(str,tempstr);
    }
    //去除结果中的前导0
    str.erase(0,str.find_first_not_of('0'));
    if (str.empty()) str="0";
    if ((sign==-1) && (str[0]!='0')) str="-"+str;
    return str;
}
string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数
    string quotient,residue; //定义商和余数
    int sign1=1,sign2=1;
    if (str2 == "0") {  //判断除数是否为0
        quotient= "ERROR!";
        residue = "ERROR!";
        if (flag==1) return quotient;
        else         return residue ;
    }
    if (str1=="0") { //判断被除数是否为0
        quotient="0";
        residue ="0";
    }
    if (str1[0]=='-') {
        str1   = str1.erase(0,1);
        sign1 *= -1;
        sign2  = -1;
    }
    if (str2[0]=='-') {
        str2   = str2.erase(0,1);
        sign1 *= -1;
    }
    int res=compare(str1,str2);
    if (res<0) {
        quotient="0";
        residue =str1;
    } else if (res == 0) {
        quotient="1";
        residue ="0";
    } else {
        string::size_type L1,L2;
        L1=str1.size();
        L2=str2.size();
        string tempstr;
        tempstr.append(str1,0,L2-1);
        for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式
            tempstr=tempstr+str1[i];
            tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
            if (tempstr.empty()) tempstr="0";//zhao4zhong1添加
            for (char ch='9';ch>='0';ch--) { //试商
                string str;
                str=str+ch;
                if (compare(MUL_INT(str2,str),tempstr)<=0) {
                    quotient=quotient+ch;
                    tempstr =SUB_INT(tempstr,MUL_INT(str2,str));
                    break;
                }
            }
        }
        residue=tempstr;
    }
    //去除结果中的前导0
    quotient.erase(0,quotient.find_first_not_of('0'));
    if (quotient.empty()) quotient="0";
    if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;
    if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;
    if (flag==1) return quotient;
    else         return residue ;
}
string DIV_INT(string str1,string str2) {//高精度除法,返回商
    return DIVIDE_INT(str1,str2,1);
}
string MOD_INT(string str1,string str2) {//高精度除法,返回余数
    return DIVIDE_INT(str1,str2,0);
}
int main() {
    char ch;
    string s1,s2,res;

    while (cin>>s1>>ch>>s2) {
        switch (ch) {
            case '+':res=ADD_INT(s1,s2);break;
            case '-':res=SUB_INT(s1,s2);break;
            case '*':res=MUL_INT(s1,s2);break;
            case '/':res=DIV_INT(s1,s2);break;
            case '%':res=MOD_INT(s1,s2);break;
            default :                   break;
        }
        cout<<res<<endl;
    }
    return(0);
}