大数除法
来源:互联网 发布: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;}
- 大数 除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 大数除法
- 高精度除法(大数除法)
- 大数,高精度计算---大数除法
- 大数除法程序解析
- 大数相除法
- 大数除法1
- 类、接口、结构的联系和区别
- 关于ZeroMQ
- Makefile怎样写
- C# GDI+编程(三)
- Java系列技术(规范、历史版本)
- 大数除法
- MSSQL数据库连接中的两个最常见错误(觉)
- Message及其使用
- C# GDI+编程(二)
- 吴江ERP软件可以根据项目进度分为几个阶段
- JAVA线程dump的分析 --- jstack pid
- Android中webView不能正常加载Twitter连接
- C# GDI+编程(一)
- 客户端UI统一框架