大数除法:
/*大数相除*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
bool CompareTwoNum(char *str1,char *str2,int Str1BeginIndex,int Str1EndIndex,int Str2BeginIndex,int Str2EndIndex)
{
int i,j,len1,len2;
bool GreaterOrEqual=true;
for(i=Str1BeginIndex;i<Str1EndIndex;i++)
if(str1[i]!='0') break;
len1=Str1EndIndex-i+1;
for(i=Str2BeginIndex;i<Str2EndIndex;i++)
if(str2[i]!='0') break;
len2=Str2EndIndex-i+1;
if(len1<len2)
GreaterOrEqual=false;
else if(len1==len2)
{
i=Str1EndIndex-len1+1;
j=Str2EndIndex-len2+1;
for(;i<=Str1EndIndex;i++,j++)
if(str1[i]>str2[j])
break;
else if(str1[i]<str2[j])
GreaterOrEqual=false;
}
return GreaterOrEqual;
}
void SubtractTwoNum(char *str1,char *str2,int Str1BeginIndex,int Str1EndIndex,int Str2BeginIndex,int Str2EndIndex)
{
int i,j,len;
for(i=Str1EndIndex,j=Str2EndIndex;j>=Str2BeginIndex;i--,j--)
{
if(str1[i]>=str2[j])
str1[i]=str1[i]-str2[j]+48;
else
{
str1[i-1]=str1[i-1]-1;
str1[i]=str1[i]+10-str2[j]+48;
}
}
}
int LoopSubtractTwoNum(char *str1,char *str2,int Str1BeginIndex,int Str1EndIndex,int Str2BeginIndex,int Str2EndIndex)
{
int loop=0;
int i,j,k;
while(CompareTwoNum(str1,str2,Str1BeginIndex,Str1EndIndex,Str2BeginIndex,Str2EndIndex))
{
SubtractTwoNum(str1,str2,Str1BeginIndex,Str1EndIndex,Str2BeginIndex,Str2EndIndex);
loop++;
}
return loop;
}
int RoundPrecision(int *result,int len)
{
//printf("len: %d\n",len);
int i=0,carry=0;
if(result[len-1]>=5) result[len-2]=result[len-2]+1;
for(i=len-2;i>0;i--)
if(result[i]>=10)
{
result[i]=result[i]%10;
result[i-1]=result[i-1]+1;
}
if(result[0]>=10)
{
result[0]=result[0]/10;
carry=1;
}
return carry;
}
int BigNumDivide(char *str1,char *str2,int *result,int len1,int len2,int &ResultSize,int PrecisionCount,int &PointPosition)
{
int i,j,k,temp;
int begin,end,index,AfterPointCount;
bool bAfterPoint=false;
begin=end=index=AfterPointCount=0;
end=begin+len2-1;
if(!bAfterPoint&&end>len1-1)
{
//result[index++]=0;
//result[index++]='.';
PointPosition=index;
bAfterPoint=true;
}
while(AfterPointCount<=PrecisionCount)
{
if(!bAfterPoint&&end>len1-1)
{
//result[index++]='.';
PointPosition=index;
bAfterPoint=true;
}
temp=LoopSubtractTwoNum(str1,str2,begin,end,0,len2-1);
result[index++]=temp;
if(bAfterPoint) AfterPointCount++;
end++;
for(;begin<end;begin++)
if(str1[begin]!='0') break;
}
ResultSize=index-1;
temp=RoundPrecision(result,index);
return temp;
}
void SetStrArrayValue(char *str,int len,char value)
{
int i;
for(i=0;i<len;i++)
str[i]=value;
}
void PrintArray(int *result,int len,int PointPosition,int carry)
{
// printf("%d %d\n",PointPosition,carry);
int i;
if(carry>0)
{
printf("%d",carry);
for(i=0;i<len;i++)
{ if(i==PointPosition) printf(".");
if(result[i]>=0&&result[i]<=9)
printf("%d",result[i]);
else printf("%c",result[i]);
}
}
else if(carry==0)
{
for(i=0;i<len;i++)
if(result[i]!=0||PointPosition==i+1) break;
for(;i<len;i++)
{ if(i==PointPosition) printf(".");
if(result[i]>=0&&result[i]<=9)
printf("%d",result[i]);
else printf("%c",result[i]);
}
}
printf("\n");
}
void PrintStrArray(char *str,int len)
{
int i;
for(i=0;i<len;i++)
printf("%c",str[i]);
printf("\n");
}
int main()
{
char str1[1000],str2[1000];
int result[1500],len1,len2,ResultSize,PrecisionCount,PointPosition,carry;
PrecisionCount=4;
SetStrArrayValue(str1,1000,'0');
while(scanf("%s%s",str1,str2)!=EOF)
{
memset(result,0,sizeof(int)*1000);
len1=strlen(str1);
len2=strlen(str2);
//PrintStrArray(str1,1000);
str1[len1]='0';
//PrintStrArray(str1,1000);
carry=BigNumDivide(str1,str2,result,len1,len2,ResultSize,PrecisionCount,PointPosition);
PrintArray(result,ResultSize,PointPosition,carry);
SetStrArrayValue(str1,1000,'0');
}
return 1;
}