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 09.01.27

posted @ 2009-01-27 20:29  端木  阅读(2484)  评论(0编辑  收藏  举报