高精度之高精除以高精

来源:互联网 发布:世界语翻译的软件 编辑:程序博客网 时间:2024/06/02 18:01

Description

高精除以高精

Input

每组测试数据个栈2行,每行代表一个高精度整数(不超过100位)

Output

每组测试数据输出占2行,分别输出商和余数。

Sample Input

1405

Sample Output

280

思路:

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

代码:

#include<iostream>#include<string>#include<cstring>using namespace std;int newcopy(int a[],int b[],int n);int cmp(int a[],int b[]);int jianfa(int a[],int b[]);int print(int a[]);int chugao(int a[],int b[],int c[]);int main(){    string s1,s2;    int a[110],b[110],c[110];    while(cin>>s1>>s2)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        memset(c,0,sizeof(c));        a[0]=s1.length();        b[0]=s2.length();        for(int i=1;i<=a[0];i++)//倒序储存每一位数字            a[i]=s1[a[0]-i]-'0';        for(int i=1;i<=b[0];i++)            b[i]=s2[b[0]-i]-'0';         chugao(a,b,c);         print(c);         print(a);    }    return 0;}int chugao(int a[],int b[],int c[]){          c[0]=a[0]-b[0]+1;//商的长度        for(int i=c[0];i>0;i--)        {            int temp[110];            memset(temp,0,sizeof(temp));            newcopy(b,temp,i);            while(cmp(a,temp)>=0)            {                c[i]++;                jianfa(a,temp);            }        }         while(c[0]>0&&c[c[0]]==0)            c[0]--;            return 0;}int print(int a[]){     if(a[0]==0)        cout<<0<<endl;     else        {        for(int i=a[0];i>0;i--)            cout<<a[i];            cout<<endl;        }        return 0;}int jianfa(int a[],int b[]){    if(cmp(a,b)==0)    {        a[0]=0;        return 0;    }    if(cmp(a,b)==1)    {        for(int i=1;i<=a[0];i++)        {            if(a[i]<b[i])            {                a[i+1]--;                a[i]+=10;            }            a[i]-=b[i];        }          while(a[0]>0&&a[a[0]]==0)//清除前导0            a[0]--;    }    return 0;}int newcopy(int a[],int b[],int n)//复制,逆序存放{    for(int i=1;i<=a[0];i++)        b[i+n-1]=a[i];    b[0]=a[0]+n-1;    return 0;}int cmp(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;//a比b大        if(a[i]<b[i])   return -1;//a比b小    }    return 0;//a b相等}
1 0
原创粉丝点击