大数除法
int cmp(string a,string b)//比较a,b大小
{
if(a==b) //ab相等
return 0;
int lenA = a.length();
int lenB = b.length();
int flag;
if(lenA==lenB){
for(int i=0;i<lenA;i++)
{
if(a[i]>b[i]){
flag=1; //a大
break;
}else if(a[i]<b[i]){
flag=-1;//b大
break;
}
}
}else if(lenA>lenB){
flag=1;//a大
}else if(lenA<lenB){
flag=-1;//b大
}
return flag;
}
string subtract(string a,string b)//a-b
{
int lenA = a.length();
int lenB = b.length();
if(a==b)
return "0";
string tmp;
string ans;
int flag=cmp(a,b);//比较两个数的大小
if(flag==-1){ //如果b大,交换位置,确保a始终比b大
tmp=b;
b=a;
a=tmp;
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i<b.length();i++)
{
if(a[i]>=b[i])
a[i]=a[i]-b[i]+'0';
else{//借1
int k=1;
while(a[i+k]=='0'){
a[i+k]='9';
k++;
}
a[i+k]=a[i+k]-'1'+'0';
a[i]=(a[i]-'0'+10)-(b[i]-'0')+'0';
}
}
reverse(a.begin(),a.end());
if(flag==-1)
return "-"+a.substr(a.find_first_not_of('0'));
return a.substr(a.find_first_not_of('0'));
}
string devide(string a,string b)
{
string ans;
int digit = 101;
if(a==b)
return "1";
int flag=1;
if(cmp(a,b)<0)
ans.append("0");
for(int i=0;i<digit;i++) //只保留101位小数
{
if(a=="0") //如果被除数减到0则结束循环
break;
if(flag&&cmp(a,b)<0){ //添加唯一一个小数点
ans.append(".");
flag=0;
}
if(cmp(a,b)<0){
a.append("0");
}
int t=0;
while(cmp(a,b)>=0){//a>=b
a=subtract(a,b); //不停做减法
t++;
}
stringstream sstream;
string tmp;
sstream<<t;
sstream>>tmp;
ans.append(tmp);
}
return ans;
}
算法介绍:
参数:两个string型的字符串,代表传入的两个乘数
返回值:需要用到大数减法的函数
注意:不允许有小数点
例:
string a="5";
string b="4";
cout<<devide(a,b);//输出1.25