poj百练2737大整数除法

题目链接:http://poj.grids.cn/practice/2737

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
const int N=102;
char s1[N],s2[N];
int p1[N],p2[N],result[N];
int subStract(int *a1,int *a2,int len1,int len2)
{
    int i;
    if(len1<len2)
        return -1;
    if(len1 == len2)
    {
        i=len1-1;
        while((a1[i]==a2[i]) && (i>=0))
            i--;
        if(0 > i)
            return 0;
        else if(a1[i]<a2[i])
            return -1;
    }
    for(i=0;i<len1;i++)
    {
        a1[i]-=a2[i];
        if(a1[i]<0)
        {
            a1[i]+=10;
            a1[i+1]--;
        }
    }
    for(i=len1-1;i>=0;i--)
    {
        if(a1[i])
            return i+1;
    }
    return 0;
}
int main()
{
    int t,i,j,k,len1,len2;
    scanf("%d",&t);
    while(t-->0)
    {
        for(i=0;i<N;i++)
        {
            result[i]=0;
            p1[i]=0;
            p2[i]=0;
            s1[i]='\0';
            s2[i]='\0';
        }
        cin>>s1>>s2;
        len1=strlen(s1);
        len2=strlen(s2);
        j=0;
        for(i=len1-1;i>=0;i--)
            p1[j++]=s1[i]-'0';
        j=0;
        for(i=len2-1;i>=0;i--)
            p2[j++]=s2[i]-'0';
        //先判断第二个数是否大于第一个数
        if(len2>len1)
        {
            printf("0\n");
            continue;
        }
        int nLen=subStract(p1,p2,len1,len2);
        if(0 == nLen)
        {
            printf("1\n");
            continue;
        }
        if(nLen<0)
        {
            printf("0\n");
            continue;
        }
        result[0]++;
        int nTimes=nLen-len2;
        if(nTimes<0)
            goto outPut;
        if(nTimes>0)
        {
            for(i=nLen-1;i>=0;i--)
            {
                if(i>=nTimes)
                    p2[i]=p2[i-nTimes];
                else
                    p2[i]=0;
            }
        }
//         for(i=nLen-1;i>=0;i--)
//             cout<<p2[i];
//         cout<<endl;
        len2=nLen;
        for(j=0;j<=nTimes;j++)
        {
            while((k=subStract(p1,p2+j,nLen,len2-j))>=0)
            {
                nLen=k;
                result[nTimes-j]++;
            }
        }
outPut:
        for(i=0;i<N;i++)
        {
            if(result[i]>=10)
            {
                result[i+1]+=result[i]/10;
                result[i]=result[i]%10;
            }
       
        }
        bool flag=true;
        for(i=N-1;i>=0;i--)
        {
            if(flag)
            {
                if(result[i])
                {
                    flag=false;
                    printf("%d",result[i]);
                }
            }
            else
                printf("%d",result[i]);
        }
        if(flag)
            printf("0\n");
        else
            printf("\n");
    }

    return 0;
}

posted on 2011-09-04 15:36  buptLizer  阅读(1085)  评论(0编辑  收藏  举报

导航