PS:爱c++爱未来
一、高精度除以低精度
采取按位相除法。
#include<cstdio> #include<iostream> using namespace std; const int maxn=1010; char a1[maxn],c1[maxn]; int a[maxn],c[maxn],x=0,b,lena,lenc,i; int main() { freopen("file.in","r",stdin); freopen("file.out","w",stdout); memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); gets(a1); cin>>b; lena=strlen(a1); for(i=0;i<=lena-1;i++) a[i+1]=a1[i]-48; //将高精度被除数放入a数组 for (i=1;i<=lena;i++) //按位相除 { c[i]=(x*10+a[i])/b; x=(x*10+a[i])%b; } lenc=1; while (c[lenc]==0&&lenc<lena) lenc++; //删除前导0 for(i=lenc;i<=lena;i++) cout<<c[i]; cout<<endl; fclose(stdin); fclose(stdout); return 0; }
二、高精除以高精
#include<cstdio> #include<iostream> #include<cstdlib> #define N 1020 int bj(int a[], int b[], int k1, int k2) /*比较大小函数*/ { int i, t, flag; /*flag作标志位*/ if(k1 < k2) flag = 0; /*被除数小于除数返回0*/ else if(k1 > k2) flag = 1; /*被除数大于除数返回1*/ else { /*被除数和除数位数相等则逐位进行比较*/ i = k1; t = 0; while(t == 0 && i > 0) { if(a[i] > b[i]) {t = 1; flag = 1;} else if(a[i] == b[i]) i--; else {t = 1; flag = 0;} } if(i == 0 && t == 0) flag = 2; /*被除数等于除数返回2*/ } return flag; } int jf(int a[], int b[], int k1, int k2) /*减法运算*/ { int i, k, d[N]; for(i = 0; i < k2; i++) d[i] = b[i]; /*把除数赋给数组d*/ for(i = k2; i < N; i++) d[i] = 0; /*d数组无数据的高位置0*/ k = k1 - k2 - 1; /*计算减法起始位置*/ if(k < 0) k = 0; if(k > 0) { for(i = k2 - 1; i >= 0; i--) d[i + k] = d[i]; /*移动减数位数与被减数对齐*/ for(i = 0; i < k; i++) d[i] = 0; /*移动后的其余位置0*/ } for(i = 0; i < k1; i++) { if(a[i] >= d[i]) a[i] -= d[i]; else { a[i + 1] = a[i + 1] - 1; a[i] = 10 + a[i] - d[i]; } } return k; } int main() { freopen("file.in","r",stdin); freopen("file.out","w",stdout); int a[N] = {0}, b[N] = {0}, c[N] = {0}, d[N] = {0}; int i, ka, kb, m, t, t1, t2, k, x, kd, kk; char a1[N], b1[N]; scanf("%s", a1); ka = strlen(a1); for(i = 0; i < ka; i++) a[i] = a1[ka - i -1] - '0'; scanf("%s", b1); kb = strlen(b1); for(i = 0; i < kb; i++) b[i] = b1[kb - i -1] - '0'; kd = ka; //保存被除数位数 t2 = bj(a, b, ka, kb); m = 0; do { while(a[ka - 1] == 0) ka--; t = bj(a, b, ka, kb); if(t >= 1) { k = jf(a, b, ka, kb); c[k]++; if(k > m) m = k; t1 = 0; for(i = k; i <= m; i++) { x = c[i] + t1; c[i] = x % 10; t1 = x / 10; } if(t1 > 0) {m++; c[m] = t1; } } }while(t == 1); if(t2 == 0) { printf("0"); printf("\n"); for(i = kd - 1; i >= 0; i--) printf("%d", a[i]); exit(1); } if(t2 == 2) { printf("1"); printf("\n0"); exit(1); } kk = kd; while(!c[kd - 1]) kd--; for(i = kd - 1; i >= 0; i--) printf("%d", c[i]); while(!a[kk]) kk--; printf("\n"); if(kk < 0) { printf("0"); exit(1); } for(i = kk; i >= 0; i--) printf("%d", a[i]); fclose(stdin); fclose(stdout); }