高精度除以高精度

    xiaoxiao2021-03-29  105

    原 题:

        高精除以高精,求它们的商和余数。

    算法分析:

       高精除以高精是用减法模拟除法,对被除数的每一位都减去除数,一直减到当前位置的数字(包括前面的余数)小于除数(由于每一位的数字小于10,所以对于每一位最多进行10次计算)

    代 码:

     #include<iostream>

    #include<cstdio> #include<cstring> using namespace std; int a[101],b[101],c[101],d,i; void init(int a[]) {string s; cin>>s; a[0]=s.length(); for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0';//减法倒序存储  } void print(int a[]) {int i; if(a[0]==0){cout<<0<<endl;return;} for(i=a[0];i>0;i--)cout<<a[i]; cout<<endl; return;  //函数执行完毕回到主程序 } int compare(int a[],int b[]) {int i;  if(a[0]>b[0])  return 1;  if(a[0]<b[0])  return-1;  for(i=a[0];i>0;i--)//如果两数位数相等,则按位比大小   {if(a[i]>b[i]) return 1;   if(a[i]<b[i])return -1;  //按位比较若该位数相同,则判断下一位   } return 0;//如果返回0则表示两数相等  }  void jian(int a[],int b[]) { int flag,i; flag=compare(a,b); if(flag==0){a[0]=0;return;} if(flag==1) {for(i=1;i<=a[0];i++) { if(a[i]<b[i]){a[i+1]--;a[i]=a[i]+10;} a[i]-=b[i]; } while(a[0]>0&&a[a[0]]==0)a[0]--; return; } } void numcpy(int p[],int q[],int det) { for(int i=1;i<=p[0];i++) q[i+det-1]=p[i]; q[0]=p[0]+det-1; //for(int i=q[0];i>0;i--) cout<<q[i]; //cout<<endl;                     打印复制后的数字,方便理解算法,此算法主要采用低位补0做减法  } void chugao(int a[],int b[],int c[])     { int i,tmp[101]; c[0]=a[0]-b[0]+1;   //商的位数不超过被除数的位数-除数的位数+1  for(i=c[0];i>0;i--)  //每次循环确定某位商的的值,从高位开始  {memset(tmp,0,sizeof(tmp)); numcpy(b,tmp,i); while(compare(a,tmp)>=0){c[i]++;jian(a,tmp);} } while(c[0]>0&&c[c[0]]==0)  c[0]--; return; } int main() {init(a);init(b); chugao(a,b,c); print(c); print(a); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-664916.html

    最新回复(0)