C++中,用类和重载运算符写高精模板
先放代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct bign
{
int len,s[1000];
bign(){len=1;memset(s,0,sizeof(s));}//构造函数,用来初始化成员变量
bign(int num){*this=num;}//拷贝构造函数,用来实现bign a=1234;
bign(char *num){*this=num;}//拷贝构造函数,用来实现bign a="1234";
bign operator =(const char *num)//重载=运算符,实现a=1234,括号中是=后接的数,以下是高精赋值,返回要返回结果
{
len=strlen(num);
for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
return *this;//*this代表当前结构体
}
bign operator =(const int num)//重载=运算符,实现a="1234"
{
char a[1000];
sprintf(a,"%d",num);
*this=a;
return *this;
}
bign operator +(bign &a)//重载+运算符,以下是高精加代码
{
bign c;
c.len=max(len,a.len)+1;//默认两数相加进位
for(int i=0,x=0;i<c.len;i++)
{
c.s[i]=s[i]+a.s[i]+x;
x=c.s[i]/10;
c.s[i]%=10;
}
if(c.s[c.len-1]==0)c.len--;//如果没有进位,长度-1
return c;
}
bign operator +=(bign &a)//重载+=运算符
{
*this=*this+a;
return *this;
}
bool operator <(bign &x)
{
if(len!=x.len)return len<x.len;//不能有前导0
for(int i=len-1;i>=0;i--)
if(s[i]!=x.s[i])
return s[i]<x.s[i];
return false;//全部相等,<不成立
}
bool operator >(bign &x){return x<*this;}//方便的是,只要重载< 运算符,其他关系运算符都可以表示出来
bool operator <=(bign &x){return !(x<*this);}
bool operator >=(bign &x){return !(*this<x);}
bool operator ==(bign &x){return !(x<*this||*this<x);}
bool operator !=(bign &x){return x<*this||*this<x;}
};
ostream& operator <<(ostream &out,bign &x)//重载<<,实现cout<<a;
{
for(int i=x.len-1;i>=0;i--)cout<<x.s[i];
return out;
}
istream& operator >>(istream &in,bign &x)//重载>>,实现cin>>a;
{
char num[1000];
in>>num;
x=num;
return in;
}
int main()
{
bign a,b,c;
cin>>a>>b;
c=a+b;
cout<<c<<endl;
return 0;
}
有人问
各种const是干什么的?
其实在这里,const的作用只是“增加程序可读性”,就是表示“这是一个不可改变的量”。
还有人问
bign(int num){*this=num;}
bign(char *num){*this=num;}
是用来干什么的?
其实这个与bign a=123;或bign a="1234";有关,就是在定义的时候赋值。
为什么用=呢?C++编译器可以自动区别赋值和初始化(构造函数是初始化),对于算法,只要记住就可以了。
本文相关知识:http://blog.csdn.net/c20190102/article/details/70738801
C++中,用类和重载运算符写高精模板的更多相关文章
- PHP中与类有关的运算符
与类有关的运算符: new, instanceof:判断一个“变量”(对象,数据),是否是某个类的“实例”: 示意如下: class A {} class B {} class C extend ...
- 继续写高精!noip2012国王游戏。。。
国王游戏 题目描述: 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- C++ Primer 学习笔记_63_重载运算符和转换 --转换和类类型【上】
重载运算符和转换 --转换与类类型[上] 引言: 在前面我们提到过:能够用一个实參调用的位 unsignedchar 相同范围的值,即:0到255. 这个类能够捕获下溢和上溢错误,因此使用起来比内置u ...
- YTU 2443: C++习题 复数类--重载运算符3+
2443: C++习题 复数类--重载运算符3+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1368 解决: 733 题目描述 请编写程序,处理一个复数与一个double数相加的运 ...
- YTU 2441: C++习题 复数类--重载运算符2+
2441: C++习题 复数类--重载运算符2+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 847 解决: 618 题目描述 定义一个复数类Complex,重载运算符"+ ...
- YTU 2440: C++习题 复数类--重载运算符+,-,*,/
2440: C++习题 复数类--重载运算符+,-,*,/ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1189 解决: 774 题目描述 定义一个复数类Complex,重载运算符& ...
- YTU 2439: C++习题 复数类--重载运算符+
2439: C++习题 复数类--重载运算符+ 时间限制: 1 Sec 内存限制: 128 MB 提交: 1022 解决: 669 题目描述 定义一个复数类Complex,重载运算符"+ ...
- 结构体作为map的key或放入set中,需要重载<运算符
结构体作为map的key或放入set中,需要重载<运算符,如下: typedef struct tagRoadKey{ int m_i32Type; int m_i32Scale; ...
- 【C++】C++中重载运算符和类型转换
输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...
随机推荐
- hibernate 关于主键
本文为北京尚学堂hibernate视频的学习笔记 1在xml中定义单个主键生成策略 1.1通过xml <id name="id" type="long" ...
- Linux Debugging(二): 熟悉AT&T汇编语言
没想到<Linux Debugging:使用反汇编理解C++程序函数调用栈>发表了收到了大家的欢迎.但是有网友留言说不熟悉汇编,因此本书列了汇编的基础语法.这些对于我们平时的调试应该是够用 ...
- (七)大图展示Demo引出的UIScrollView的使用
UIScrollView是一个能够滚动的视图控件,可以通过滚动查看所有内容. 用途: 1.一张大图屏幕放不下,可以用各个方向的手势来看大图的各个部分. 2.手机的设置页面有很多的选项,需要上下滚动来查 ...
- Salesforce开发入门
云计算风起云涌,已成势不可挡之势.公司好多项目都依托于云平台了,网络安全采用了zscaler,人力资源系统用的workday,我们case系统也用了salesforce,我自己也在用运行于Google ...
- Tomcat configuration DataSource
1. configuration MySql Connection DataSource 原理介绍 java 调用 Tomcat 中的 ConnectionPool 通过Context 中去查找 j ...
- C语言之回文数算法
"回文"是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如"我为人人,人人为我"等.在数学中也有这样一类数字有这样的特征,成为回文数(pa ...
- Dijkstra算法 c语言实现
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优 ...
- Linux进程通信学习总结
http://blog.csdn.net/xiaoweibeibei/article/details/6552498 SYSV子系统的相关概念 引用标识符:引用标识符是一个整数,表示每一个SYSV ...
- GNU C 与 ANSI C的区别
1.零长度数组 GNU C允许使用零长度数组,定义变长度对象时比较方便 struct var_data { int len; char data[0]; }; var_data的大小仅为一个int型, ...
- MurmurHash
public int hash(byte[] data, int length, int seed) { int m = 0x5bd1e995; int r = 24; int ...