高精度除法
阿新 • • 發佈:2018-03-08
printf true () oid return names cstring -- ==
今天嘗試寫了高精度除法(n進制),感覺不錯,只有一處一開始沒有註意到,後來才看書發現,見註釋。
代碼如下:
#include<iostream> #include<cstdio> #include<cstring> #define MAXN 100005 using namespace std; int n,a[MAXN],b[MAXN],c[MAXN],tmp[MAXN]; char dc[MAXN]; void init(int a[]) { a[0]=strlen(dc); for(int i=1;i<=a[0];i++) { if(dc[a[0]-i]>=‘0‘&&dc[a[0]-i]<=‘9‘) a[i]=int(dc[a[0]-i])-‘0‘; else a[i]=int(dc[a[0]-i])-‘A‘+10; } } int com(int a[],int b[]) { if(a[0]<b[0])return -1; if(a[0]>b[0])return 1; for(int i=a[0];i>0;i--) { if(a[i]>b[i])return 1; if(a[i]<b[i])return -1; } return 0; } void print(int a[]) { if(a[0]==0) { printf("0\n");return; } for(int i=a[0];i>0;i--) printf("%d",a[i]); printf("\n"); } void add(int a[],int b[],int det)//在b第det位開始復制a { b[0]=det+a[0]-1; for(int i=det;i<=b[0];i++) b[i]=a[i-det+1]; } void jian(int a[],int b[])//a-b { if(com(a,b)==0) { a[0]=0;return; } for(int i=1;i<=a[0];i++) { if(a[i]<b[i])a[i]+=n,a[i+1]--; a[i]-=b[i]; } } void chugao(int a[],int b[])//a/b { if(com(a,b)<0) { c[0]=1;c[1]=0;return; } if(com(a,b)==0) { c[0]=1;c[1]=1;a[0]=0;return; } c[0]=a[0]-b[0]+1; for(int i=a[0]-b[0]+1;i>0;i--) { memset(tmp,0,sizeof tmp);//!!!否則com時會出錯 add(b,tmp,i); while(com(a,tmp)>=0) { jian(a,tmp); c[i]++; // for(int i=a[0];i>0;i--) // { // if(a[i]==0)a[0]--; // else break; // } while(a[0]>0&&a[a[0]]==0)a[0]--; } } while(c[0]>0&&c[c[0]]==0)c[0]--; // c[0]=1; // while(c[c[0]]==0)c[0]++; } int main() { cin>>n; cin>>dc; init(a); cin>>dc; init(b); chugao(a,b); // for(int i=a[0]-b[0]+1;i>=c[0];i--) // printf("%d",c[i]); // printf("\n"); // for(int i=a[0];i>0;i--) // printf("%d",a[i]); print(c); print(a); return 0; }
高精度除法