您的位置:首页 > 其它

大整数除法

2015-07-12 19:48 323 查看
//大整数除法
#include<stdio.h>
#include<string.h>

#define MAX_LEN 200

char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];

int an1[MAX_LEN+10];
int an2[MAX_LEN+10];

int aResult[MAX_LEN+10];
int Substract(int *p1,int *p2,int nLen1,int nLen2)//返回值代表结果的长度
{
int i;
if(nLen1<nLen2) return -1;
bool bLarger=false;
if(nLen1==nLen2)
{
for(i=nLen1-1;i>=0;i--)
{
if(p1[i]>p2[i])
bLarger=true;
else if(p1[i]<p2[i]){
if(!bLarger)
return -1;
}
}
}
for(i=0;i<nLen1;i++)
{
p1[i]-=p2[i];
if(p1[i]<0)
{
p1[i]+=10;
p1[i+1]--;
}
}
for(i=nLen1-1;i>=0;i--)
if(p1[i])
return i+1;
return 0;
}
int main()
{
int t,n;
scanf("%d",&n);
for(t=0;t<n;t++)
{
scanf("%s",szLine1);
scanf("%s",szLine2);
int i,j;
memset(an1,0,sizeof(an1));
memset(an2,0,sizeof(an2));
memset(aResult,0,sizeof(aResult));
int nLen1=strlen(szLine1);
j=0;
for(i=nLen1-1;i>=0;i--)
an1[j++]=szLine1[i]-'0';
int nLen2=strlen(szLine2);
j=0;
for(i=nLen2-1;i>=0;i--)
an2[j++]=szLine2[i]-'0';
if(nLen1<nLen2)
{
printf("0\n");
continue;
}
nLen1=Substract(an1,an2,nLen1,nLen2);
if(nLen1<0)
{
printf("0\n");
continue;
}
else if(nLen1==0)
{
printf("1\n");
continue;
}
aResult[0]++;
int nTimes=nLen1-nLen2;
if(nTimes<0)
goto OutputResult;
else if(nTimes>0)
{
for(i=nLen1-1;i>=0;i--)
{
if(i>=nTimes)
an2[i]=an2[i-nTimes];
else
an2[i]=0;
}
}
nLen2=nLen1;
for(j=0;j<=nTimes;j++)
{
int nTmp;
while((nTmp=Substract(an1,an2+j,nLen1,nLen2-j))>=0)
{
nLen1=nTmp;
aResult[nTimes-j]++;
}
}
OutputResult:
for(i=0;i<MAX_LEN;i++)
{
if(aResult[i]>=10)
{
aResult[i+1]+=aResult[i]/10;
aResult[i]%10;
}
}
bool bStartOutput=false;
for(i=MAX_LEN;i>=0;i--)
if(bStartOutput)
printf("%d",aResult[i]);
else if(aResult[i])
{
printf("%d",aResult[i]);
bStartOutput=true;
}
if(!bStartOutput) printf("0\n");
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: