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 阅读(1080) 评论(0) 编辑 收藏 举报