天天看點

高精度計算:高精除以高精

//高精除以高精 
#include<iostream>
#include<cstring>
using namespace std;
int a[101],b[101],c[101],i;//a是被除數,b是除數,c是商 
//輸入函數 
void init(int a[])
{
    string s;
    cin>>s;
    a[0]=s.length();//用a[0]來存這個數的位數 
    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)//如果原來最高位數減完,就将位數-1 
            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];//i:數位(個1十2) 
    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));//将tmp中數字都變成0,便于補0 
        numcpy(b,tmp,i);//補0 
        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; 
}
           

繼續閱讀