大数除法

来源:互联网 发布:win7美化软件 编辑:程序博客网 时间:2024/05/01 17:19

大数除法:

/*大数相除*/#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;}