由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。大數運算主要有加、減、乘三種方法。
考慮用陣列儲存整數,並模擬手算的方法進行加減乘除四則運算。為了能像int一樣方便的使用大整數,可以定義結構體,大整數類。
結構體biginteger可用於儲存高精度非負整數。這裡儲存的方案是每8位存在乙個陣列的元素裡,所用base為1億,也就是1e8這麼多,從低位向高位儲存
比如:123456789123456789 儲存為| 23456789 |34567891 |12|在乙個陣列中。
1還可以過載「<>」運算子,使用方便struct
biginteger2//
建構函式
8 biginteger operator=(long
long num)//
賦值運算子
9while(num>0
);16
return *this;17
}18 biginteger operator=(const
string& str)//
賦值運算子
1929
return *this;30
}31 }
1 friend ostream& operator由於c++的繼承機制,現在istream類和ostream類都可以使用它來輸出輸入大整數了<
}13return
out;14}
15 friend istream& operator>>(istream &in,biginteger&x)
16
上述**中base是靜態成員變數,屬於這個型別而不屬於靜態物件,用static修飾
1 biginteger operator+(const biginteger& b) const211一開始就比較兩個數的位數,不相等直接返回,否則從後往前比(低位在前)。注意這是在沒有前導零的情況下才能這樣比,有前導零最後一位還要單獨處理。int x = g;//
g為進製數,滿乙個base才向下進一位
12if(is[i];
13if(ib.s[i];
14 c.s.push_back(x%base);//
進製後本位上的數
15 g = x/base;//
更新進製數16}
17return
c;18
}19 biginteger operator+=(const biginteger&b)
20
bool這時依賴比較運算子的容器函式就可以支援大整數類了。operator
for(int i = s.size()-1;i>=0;i--)
}return
false
; }
bool
operator>(const biginteger& b) const
bool
operator
<=(const biginteger& b) const
bool
operator>=(const biginteger& b) const
bool
operator!=(const biginteger& b) const
bool
operator==(const biginteger& b) const
**彙總:
1 #include 2 #include 3 #include 4 #include 5 #includeview code6 #include7
using
namespace
std;
8struct
biginteger9//
建構函式
15 biginteger operator=(long
long num)//
賦值運算子
16while(num>0
);23
return *this;24
}25 biginteger operator=(const
string& str)//
賦值運算子
2636
return *this;37
}38 friend ostream& operator
<
3949}50
return
out;51}
52 friend istream& operator>>(istream &in,biginteger&x)
5359
60bool
operator
6166
for(int i = s.size()-1;i>=0;i--)
6772}73
return
false;74
}75bool
operator>(const biginteger& b) const
7679
bool
operator
<=(const biginteger& b) const
8083
bool
operator>=(const biginteger& b) const
8487
bool
operator!=(const biginteger& b) const
8891
bool
operator==(const biginteger& b) const
9295 biginteger operator+(const biginteger& b) const
96105
int x = g;//
g為進製數,滿乙個base才向下進一位
106if(is[i];
107if(ib.s[i];
108 c.s.push_back(x%base);//
進製後本位上的數
109 g = x/base;//
更新進製數
110}
111return
c;112
}113 biginteger operator+=(const biginteger&b)
114118
};119
sets;
120 mapint>m;
121int
main()
122
高精度之大數階乘
大數階乘 序言 今天是我寫部落格的第二天,差點忘了寫,反思一下,下次要早點發。大數階乘也是高精度題目中的入門題。它的主要思路和上一次我發的大數加法相似,也是以陣列來按位處理資料。他的難度級別應該比大數加法還低一點。他的輸入很簡單,也不需要定義多餘的輔助陣列。只需要將需要求階乘的數先輸入到陣列中。再將...
高精度之大數除法
大數除法說的比較少或許不像加法減法那樣簡單,或許是用的不太多。到底怎麼我也不知道。反正你會了加法減法,乘法而不會除法,就像是,開啟電腦而不玩遊戲,心裡難受。我是從看到了大神部落格後學習了一下。部落格中講的很詳細 讓人一看就懂,我很佩服這位同學。果斷的關注了。畢竟別人寫的是別人的。自己寫的才是自己的 ...
基礎演算法 高精度 大整數
學習平台 acwing 高精度的數一般比較大,普通的整型變數存不下,所以存在string裡或者char裡 模擬數學的普通加法 len a 10 9 len b 10 9 為了方便地進行進製操作,將大整數的每一位倒著存放在整形陣列int裡 string a,b vectora,b cin a b fo...