超级大数除法
问题描述
求两个大的正整数相除的商
输入数据
第 1 行是测试数据的组数n,每组测试数据占2 行,第1 行是被除数,第2 行是除数。
每组测试数据之间有一个空行,每行数据不超过100 个字符
输出要求
n 行,每组测试数据有一行输出是相应的整数商
输入样例
3
2405337312963373359009260457742057439230496493930355595797660791082739646
2987192585318701752584429931160870372907079248971095012509790550883793197894
10000000000000000000000000000000000000000
10000000000
5409656775097850895687056798068970934546546575676768678435435345
1
输出样例
0
1000000000000000000000000000000
5409656775097850895687056798068970934546546575676768678435435345
解题思路
基本的思想是反复做减法,看看从被除数里最多能减去多少个除数,商就是多少。一个
一个减显然太慢,如何减得更快一些呢?以7546 除以23 为例来看一下:开始商为0。先减
去23 的100 倍,就是2300,发现够减3 次,余下646。于是商的值就增加300。然后用646
减去230,发现够减2 次,余下186,于是商的值增加20。最后用186 减去23,够减8 次,
因此最终商就是328。
所以本题的核心是要写一个大整数的减法函数,然后反复调用该函数进行减法操作。
计算除数的10 倍、100 倍的时候,不用做乘法,直接在除数后面补0 即可。
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
string divide();
int subtract() ;
string num1,num2;
void main()
{
cout<<"Please input numbers!"<<endl;
cout<<"num1:";
cin>>num1;
cout<<"num2:";
cin>>num2;
string r;
r=divide();
cout<<r<<endl;
}
string divide()
{
int len1,len2;
len1=num1.size();
len2=num2.size();
if(len1==len2)
{
if(num1>num2)
return "1";
return "0";
}//除数于被除数长度相同
else if(len1<len2)
{
return "0";
}//除数长度小于被除数,直接返回0
else
{
int p=len1-len2;
for(int i=0;i<p;i++)
{
num2+="0";
}
char res[]="00000000000000000000000000000000000000000000000000000000000000";//保存除的结果
while(p>=0)
{
int t=0;
while(subtract()>=0)
{
t++;
}
res[(sizeof(res)/sizeof(char))-p-1]=t+'0';
p--;
num2=num2.substr(0,len2+p);
}
int t;
for(int m=0;m<(sizeof(res)/sizeof(char));m++)
{
if(res[m]!='0')
{
t=m;
break;
}
}
return res+t;
}//除数长度大于被除数长度
}
int subtract()
{
int len1,len2;
len1=num1.size();
len2=num2.size();
int arr[100];
if(len1>=len2)
{
if(len1==len2 && num1<num2)
return -1;
for(int i=0;i<len1;i++)
{
if(i<len2)
arr[i]=num1[len1-i-1]-num2[len2-1-i];
else
{
arr[i]=num1[len1-1-i]-'0';
}
}
for(int j=0;j<len1;j++)
{
if(arr[j]<0)
{
arr[j]+=10;
arr[j+1]-=1;
}
}
int k;
for(int b=len1-1;b>=0;b--)
{
if(arr[b]!=0)
{
k=b;
break;
}
}
string s="";
for(int x=k;x>=0;x--)
{
char t[3];
s+=itoa(arr[x],t,10);
}
num1=s;
return 1;
}
else
{
return -1;
}
}
//输出控制的不好,懒的改了
浙公网安备 33010602011771号