C++高精度运算类bign (重载操作符)
大数据操作,有例如以下问题:
计算:456789135612326542132123+14875231656511323132
456789135612326542132123*14875231656511323132
比較:7531479535511335666686565>753147953551451213356666865 ?
long long类型存储不了,存储不了就实现不成计算,怎么办???
为了解决以上问题,所以得定义一种结构类型以存储这些数据,并重载运算符支持这些数据的操作。为了方便代码的复用因此有了例如以下代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int maxn = 200;
struct bign{
int len, s[maxn]; /*下面的构造函数是C++中特有的,作用是进行初始化。
其实,当定义bign x时,就会运行这个函数,把x.s清零。并赋x.len=1 。
须要说明的是,在C++中,并不须要typedef就能够直接用结构体名来定义,并且
还提供“自己主动初始化”的功能,从这个意义上说。C++比C语言方便
*/
bign() {
memset(s, 0, sizeof(s));
len = 1;
} bign(int num) {
*this = num;
} //定义为const參数,作用是 不能对const參数的值做改动
bign(const char* num) {
*this = num;
}
/*以上是构造方法。初始化时对运行对应的方法*/ bign operator = (int num) {
char s[maxn];
sprintf(s, "%d", num);
*this = s;
return *this;
} //函数定义后的constkeyword,它表明“x.str()不会改变x”
string str() const {
string res = "";
for(int i = 0; i < len; i++) res = (char)(s[i] + '0') + res;
if(res == "") res = "0";
return res;
} void clean() {
while(len > 1 && !s[len-1]) len--;
} /* 下面是重载操作符 */
bign operator = (const char* num) {
//逆序存储,方便计算
len = strlen(num);
for(int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
return *this;
} bign operator + (const bign& b) const{
bign c;
c.len = 0;
for(int i = 0, g = 0; g || i < max(len, b.len); i++) {
int x = g;
if(i < len) x += s[i];
if(i < b.len) x += b.s[i];
c.s[c.len++] = x % 10;
g = x / 10;
}
return c;
} bign operator * (const bign& b) {
bign c; c.len = len + b.len;
for(int i = 0; i < len; i++)
for(int j = 0; j < b.len; j++)
c.s[i+j] += s[i] * b.s[j];
for(int i = 0; i < c.len-1; i++){
c.s[i+1] += c.s[i] / 10;
c.s[i] %= 10;
}
c.clean();
return c;
} bign operator - (const bign& b) {
bign c; c.len = 0;
for(int i = 0, g = 0; i < len; i++) {
int x = s[i] - g;
if(i < b.len) x -= b.s[i];
if(x >= 0) g = 0;
else {
g = 1;
x += 10;
}
c.s[c.len++] = x;
}
c.clean();
return c;
} bool operator < (const bign& b) const{
if(len != b.len) return len < b.len;
for(int i = len-1; i >= 0; i--)
if(s[i] != b.s[i]) return s[i] < b.s[i];
return false;
} bool operator > (const bign& b) const{
return b < *this;
} bool operator <= (const bign& b) {
return !(b > *this);
} bool operator == (const bign& b) {
return !(b < *this) && !(*this < b);
} bign operator += (const bign& b) {
*this = *this + b;
return *this;
}
}; istream& operator >> (istream &in, bign& x) {
string s;
in >> s;
x = s.c_str();
return in;
} ostream& operator << (ostream &out, const bign& x) {
out << x.str();
return out;
} int main() {
bign a;
cin >> a;
a += "123456789123456789000000000";
cout << a*2 << endl;
return 0;
}
C++高精度运算类bign (重载操作符)的更多相关文章
- [code]高精度运算
数组存储整数,模拟手算进行四则运算 阶乘精确值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #includ ...
- C++ 重载操作符与转换
<C++ Primer 4th>读书笔记 重载操作符是具有特殊名称的函数:保留字 operator 后接需定义的操作符号. Sales_item operator+(const Sales ...
- 《C++ Primer》之重载操作符与转换(下)
转换与类类型 可用一个实参调用的非 explicit 构造函数定义一个隐式转换.当提供了实参类型的对象而需要一个类类型的对象时,编译器将使用该转换.这种构造函数定义了到类类型的转换.除了定义到类类型的 ...
- C++之重载操作符
1.类中重载+操作符 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Obje ...
- 大整数类BIGN的设计与实现 C++高精度模板
首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...
- VC6.0中重载操作符函数无法访问类的私有成员
整理日: 2015年03月18日 在 C++ 中,操作符(运算符)可以被重载以改写其实际操作.同时我们可以定义一个函数为类的朋友函数(friend function)以便使得这个函数能够访问类的私有成 ...
- java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http: ...
- 解释清楚c++的重载操作符【用自己的话,解释清楚】
C++中对于内置的变量及标准库中常见的类定义类常见的操作符含义,对于自定义的类也可以通过关键字operate 重载操作符的含义. C++中支持重载的目的 诚然操作符的重载可以通过使用函数实现同样的功能 ...
- C++ operator关键字(重载操作符)(转)
operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名. 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算 ...
随机推荐
- 字体圆润属性的使用-webkit-font-smoothing: antialiased
字体渲染和抗锯齿技术 据称该属性在window下不起作用,不知win10如何,但是在OS和ios中会有不同的展示效果,主要也是展示在webkit内核中,以及android和ios中 大概是说字体渲染的 ...
- Bootstrap_Javascript_按钮插件
一 . 加载状态按钮 HTML: <button class="btnbtn-primary" data-loading-text="正在加载中,请稍等...&qu ...
- openshif ssh proxy
最近google又被墙了.没办法 1:注册一个openshift账号.申请注册一个app,获取一个免费主机. https://www.openshift.com/ 2:去PuTTY官方网站下载pL ...
- bzoj3864: Hero meet devil
Description There is an old country and the king fell in love with a devil. The devil always asks th ...
- Java中的自动拆箱装箱(Autoboxing&Unboxing)
一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...
- html中混入的特殊字符
从设计那里拿来的psd中常常会有全角的单双引号. 如果只是拷贝这些字符到做好的html里面,顶多看到乱码再加以改正. 但是,如果是通篇的doc,需要加上各种html语义标签,在拷贝来的doc文字之间加 ...
- scheme corotuine
In cooperative multithreading, a thread must yield control manually; it will not be preemptively swi ...
- 两款商业拓扑发现软件siteview和ElementSentry的比较
今天在公司试用了一下两款商业拓扑发现软件游龙科技的siteview和速方软件ElementSentry. 条目/产品 速方软件ElementSentryv5.0 游龙科技Siteview NNM v3 ...
- 利用over开窗函数取第一条记录
SQL> set linesize 200 SQL> select * from (select a.* ,row_number() over( order by empno) rn f ...
- Unix/Linux运维首选工具Xmanager Enterprise 3.0的使用教程
管理Uinx和Linux服务器的兄弟们应该很熟悉Xmanager,一个窗口可以同时控制上百台Linux和Unix服务器,功能非常强大!^_^请看: manager是一个简单易用的高性能的运行在Wind ...