BBBBB

超级大数除法

问题描述

求两个大的正整数相除的商

输入数据

第 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;
	}
}


//输出控制的不好,懒的改了

  

posted @ 2011-09-06 09:51  如是然  阅读(7655)  评论(0编辑  收藏  举报