高精度除法

高精度除法

大致思路:

将除法当减法来做,循环相减可得商的每一位。

代码如下:

 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'
posted @ 2021-07-31 17:43  Rekord  阅读(159)  评论(0编辑  收藏  举报