高精度除法
大致思路:
将除法当减法来做,循环相减可得商的每一位。
代码如下:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int N=305; 5 6 void init(int arr[],char str[]){ 7 arr[0]=strlen(str); 8 for(int i=1;i<=arr[0];i++){ 9 arr[i]=str[arr[0]-i]-48; 10 } 11 } 12 int compare(int a[],int tmp[]){ 13 if(a[0]>tmp[0])return 1; 14 else if(a[0]<tmp[0])return -1; 15 else{ 16 for(int i=a[0];i>0;i--){ 17 if(a[i]>tmp[i])return 1; 18 if(a[i]<tmp[i])return -1; 19 } 20 return 0; 21 } 22 23 } 24 void subtract(int a[],int tmp[]){ 25 for(int i=1;i<=tmp[0];i++){ 26 if(a[i]-tmp[i]<0){ 27 a[i+1]--; 28 a[i]+=10; 29 } 30 a[i]-=tmp[i]; 31 } 32 //重新计算有效长度 33 while(a[0]>0&&a[a[0]]==0)a[0]--; 34 } 35 int main(){ 36 char str1[N],str2[N]; 37 int a[N],b[N],c[N]; 38 //输入 39 cin>>str1>>str2; 40 //初始化数据 41 init(a,str1); 42 init(b,str2); 43 memset(c,0,sizeof(c)); 44 45 int tmp[N]; 46 //确定结果最大位数 47 c[0]=a[0]-b[0]+1>0?a[0]-b[0]+1:0; 48 //核心算法 49 for(int i=c[0];i>0;i--){ 50 memset(tmp,0,sizeof(tmp)); 51 for(int j=1;j<=b[0];j++){ 52 tmp[i+j-1]=b[j]; 53 } 54 //确定长度 55 tmp[0]=b[0]+i-1; 56 while(compare(a,tmp)>=0){ 57 c[i]++; 58 subtract(a,tmp); 59 } 60 } 61 // 输出结果 62 // 1.输出商 63 if(c[c[0]]>0||c[0]<=1)cout<<c[c[0]]; 64 for(int i=c[0]-1;i>0;i--)cout<<c[i]; 65 cout<<endl; 66 //2.输出余数 67 if(a[0]==0)cout<<0; 68 for(int i=a[0];i>0;i--)cout<<a[i]; 69 return 0; 70 }
额外收获:
- memset is defined in header '<cstring'