#include #include #include #include#include using namespace std;
//大數運算最關鍵的是用進製理解,就是把乙個陣列元素表示的最大值作為乙個進製;如此,最容易的大數運算也是最耗費空間的就是乙個元素表示一位數字,即用十進位制表示;還有一種折中的方案,是乙個元素最大能表示9999,如此用的是10000進製,則下面的basenum = 10000;本文的實現的是最省空間的方法,乙個元素就是乙個unsigned short,這樣就表示用2^16進製制
const int maxshort = 100;//最多有maxshort * 2個位元組//如果要表示64位int,maxshort = 4
const int basenum = pow(2.0,16.0);
const int shift = 16;
typedef unsigned short unshort;
typedef struct bignum
bignum;
void reverse(char *src);
void getabsdecnum(bignum &bg,char *tgt);
void printdata(bignum &a)
return bg;
}int absminus(bignum &bg1,int n,bignum &bg2)//必須保證bg1的前n位的數要大於等於bg2//返回減少的位數
bool abscomp(bignum &a,int n,bignum &b)//大數的前n位數與b比較大小;a>=b返回true
return true;
}bignum absdiv(bignum &bg1,bignum &bg2)//返回商,bg1變為餘數;被除數的位數為n,除數的位數為m,則商的位數最多為n-m+1
bignum absadd(bignum &bg1,bignum &bg2)
int carry = 0;
bignum bg;
for (int i=0;i>shift;
= tmp &(1carry = tmp>>shift;
//carry = tmp /basenum;
= tmp &(1<0)
}if(bg.m_data[bg1.m_len+bg2.m_len -1] > 0)
bg.m_len = bg1.m_len+bg2.m_len;
else
bg.m_len = bg1.m_len+bg2.m_len -1;
return bg; }
void getabsdecnum(bignum &bg,char *tgt)
tgt[b++] = reminder + '0';
while(size>0 && data[size -1]==0)
--size;
} tgt[b] = '\0';
}void reverse(char *src)
}int main()
,b=,結果result=:
先取a[0]a[1]即24,減去b一次,得a=,result=;
再取a[1]a[2]即12,發現它小於b,則多取一位,取a[1]a[2]a[3]即123,減b五次,得a=,result=;
再取a[3]a[4]即81,減b三次,得a=,result=。
如果按照方法一計算,效率是無法容忍的。
假如用11111除以1,方法一要計算11111次,而方法二則只要5次。
下面是方法二的**,經過了簡單的測試(沒做資料校驗,假設資料都是正常的):
bool compare(int a,int n,int b,int m)//當a>=b時,返回true
while(b[j]==0)
if(temp_n>temp_m)
return true;
else if(temp_nb[j])return true;
if(a[i]=1;i--)
else
***=0;
temp[i]=min;
}temp[i]-=***;
result[end-1]++;
}if(end-start==m)
{for(i=start;i
高精度除法 大數除法
問題描述 給出兩個正整數,計算a b的值,保證a和b的位數不超過500位。輸入描述 輸入兩個用空格隔開的正整數。輸出描述 輸出a b的值。樣例輸入 500 2 樣例輸出 250 解題思路 大數除法的實現有兩種方式 1 用a b,迴圈,直到a 計算過程 擴充套件b的位數 a.length b.lent...
大數運算,佇列實現大數 加法 乘法 除法 模除
以下 可進行大數加法 減法 乘法 除法 餘除,和比較大小的計算 佇列實現 包括負數 include include include include include includeusing namespace std const int mod 1e9 typedef long long ll co...
大數除法1
string bignum bigdiv string s1,string s2 else else if f1 1 記錄小數字數 for i 0,b 0,f1 0,sl2 0 iif s2 i 除小數點並進行相應記錄 else else if f1 1 記錄小數字數 s1.erase 0,l1 s...