POJ 2737 大整数除法 解题报告
POJ 2737 大整数除法 解题报告
编号:2737
考查点:高精度计算,大数运算
思路:除法属于最复杂的大数运算,除法中包含了大数减法的运算,其中减法的优化部分是把除数乘以可以在数组中移动的位置,即10的倍数,感觉属于除法+减法的运算。
提交情况: debug很困难,但是仍然保持提交一次就AC..oh yeah,比较奇怪的是提交了四次,竟然有一次是0MS,其它都是16MS.。
Source Code:
//POJ Grids 2737
#include <string>
#include <iostream>
using namespace std;
#define MAX 200
int num1[MAX+10];
int num2[MAX+10];
unsigned int total[MAX+10];
int Sub(int a,int b)
{
if (b>=a)
{
if (a==b)
return 0;
else
return -1;
}
int i = 0;
for (;a>b;i++)
{
b++;
}
return i;
}
int main()
{
int n;
cin>>n;
while(n--)
{
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
memset(total,0,sizeof(total));
string str1,str2;
cin>>str1>>str2;
int len,index;
len = str1.length();
index = 0;
for (int i=len-1;i>=0;i--)
{
num1[index++] = str1[i]-'0';
}
len = str2.length();
index = 0;
for (int i=len-1;i>=0;i--)
{
num2[index++] = str2[i]-'0';
}
if (str2.length()>str1.length())
{
cout<<"0"<<endl;
continue;
}
int len1,len2,length;
len1 = str1.length();
len2 = str2.length();
length = Sub(len1,len2);
while (1)
{
for (int i=len1-1;i>=0;i--)
{
if (num1[i])
{
len1 = i+1;
break;
}
}
len = Sub(len1,len2);
int index = 0;
bool flag = false;
for (int i=len1-1;i>=len;i--)
{
if (num1[i]<num2[i-len])
{
flag = true;
break;
}
if (num1[i]>num2[i-len])
{
break;
}
}
if (flag)
len--;
if (len==-1)
break;
while (++index)
{
bool flag = false;
for (int i=len1-1;i>=len;i--)
{
if (num1[i]<num2[i-len])
{
flag = true;
break;
}
if (num1[i]>num2[i-len])
{
break;
}
}
if (flag)
{
index--;
break;
}
for (int i=len;i<len1;i++)
{
num1[i] -= num2[i-len];
if (num1[i]<0)
{
num1[i] += 10;
num1[i+1]--;
}
}
}
if (index==0)
break;
else
total[len] = index;
}
bool flag = false;
for (int i=length;i>=0;i--)
{
if (flag||total[i])
{
flag = true;
cout<<total[i];
}
}
if (!flag)
{
cout<<"0";
}
cout<<endl;
}
}
总结: 这个题很不爽,大数除法确实是最难的大数运算,虽然AC了,但是代码写的很乱,思路很不清晰..思路上面说了,但是由于其复杂性,很多地方都要做判断,漏了一个就前功尽弃了..。
By Ns517
Time