bignum 大数模板
今天无意间看到一个很好的大数模板,能算加、减、乘、除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减。我借用了一下:(作过少许代码上的精简)
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
using namespace std; const int maxn = ; struct bign{
int len, s[maxn];
bign(){
memset(s,,sizeof(s));
len= ;
}
bign(int num) { *this = num; }
bign(const char *num) { *this = num; }
bign operator = (const int num){
char s[maxn];
sprintf(s,"%d",num);
return *this = s;
}
bign operator = (const char *num){
for(int i = ; num[i] && num[i] ==''; ++num) ;
len = strlen(num);
for(int i = ; i < len; ++i)
s[i] = num[len--i] -'';
return *this;
}
bign operator + (const bign &b) const {
bign c;
c.len = ;
int maxlen = max(len, b.len);
for(int i = , g = ; g || i < maxlen; ++i){ // g是进位
int x = g;
if(i < len) x += s[i];
if(i < b.len) x += b.s[i];
c.s[c.len++] = x % ;
g = x / ;
}
return c;
}
bign operator += (const bign &b){
return *this = *this + b;
}
void clean(){
while(len > && !s[len-]) --len;
}
bign operator * (const bign &b) const {
bign c;
c.len = len + b.len; for(int i = ; i < len; ++i)
for(int j = ; j < b.len; ++j)
c.s[i+j] += s[i] * b.s[j]; for(int i = ; i < c.len; ++i){
c.s[i+] += c.s[i]/;
c.s[i] %= ;
}
c.clean();
return c;
}
bign operator *= (const bign &b){
return *this = *this * b;
}
bign operator -(const bign &b) const {
bign c;
c.len = ;
for(int i = , g = ; i < len; ++i){ //此时的 g是退位
int x = s[i]- g;
if(i < b.len) x -= b.s[i];
if(x >= ) g = ;
else {
g = ;
x += ;
}
c.s[c.len++] = x;
}
c.clean();
return c;
}
bign operator -= (const bign &b){
return *this = *this - b;
}
bign operator / (const bign &b) const {
bign c, f = ;
for(int i = len-; i >= ; --i){
f *= ;
f.s[] = s[i];
while(f >= b){
f -= b;
++c.s[i];
}
}
c.len = len;
c.clean();
return c;
}
bign operator /= (const bign &b){
return *this = *this / b;
}
bign operator % (const bign &b) const {
bign r = *this / b;
return *this- r*b;
}
bign operator %= (const bign &b){
return *this = *this % b;
}
bool operator < (const bign &b) const {
if(len != b.len) return len < b.len;
for(int i= len-; i>=; --i)
if(s[i] != b.s[i]) return s[i] < b.s[i];
return ;
}
bool operator > (const bign &b) const {
if(len != b.len) return len > b.len;
for(int i = len-; i >= ; --i)
if(s[i] != b.s[i]) return s[i] > b.s[i];
return ;
}
bool operator == (const bign &b) const {
return !(*this < b || *this > b);
}
bool operator != (const bign &b) const {
return !(*this == b);
}
bool operator <= (const bign &b) const {
return *this < b || *this == b;
}
bool operator >= (const bign &b) const {
return *this > b || *this == b;
}
string str() const {
string res = "";
for(int i = ; i < len; ++i)
res = char(s[i]+'') + res; //这里一定不能掉乱 +的顺序!
return res;
}
}; 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,b,c,d,e,f,g;
while(cin>>a>>b)
{
a.clean();
b.clean();
c = a+b;
d = a-b;
e = a*b;
f = a/b;
g = a%b;
cout<<"a+b = "<<c<<endl;
cout<<"a-b = "<<d<<endl;
cout<<"a*b = "<<e<<endl;
cout<<"a/b = "<<f<<endl;
cout<<"a%b = "<<g<<endl;
cout<<(a==b? "a = b":"a != b")<<endl;
}
return ;
}
在此感谢原博客的模板提供: bign类C++高精度模板
bignum 大数模板的更多相关文章
- hdu 5429 Geometric Progression(存个大数模板)
Problem Description Determine whether a sequence is a Geometric progression or not. In mathematics, ...
- 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...
- hdu1042(大数模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 在网上找了个大数模板方便以后用得到. #include<iostream> #inc ...
- 大数模板 poj3982
1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就 ...
- Hdu 4762 网络赛 高精度大数模板+概率
注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...
- vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)
P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...
- c++大数模板
自己写的大数模板,参考了小白书上的写法,只是实现了加减乘法,不支持负数,浮点数.. 除法还没写o(╯□╰)o以后再慢慢更吧.. 其实除法我用(xie)的(bu)少(lai),乘法写过fft,这模板还是 ...
- ACM大数模板(支持正负整数)
之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大 ...
- 大数模板 (C ++)
上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. //可以处理字符串前导零 #i ...
随机推荐
- ci中简单实用的权限管理
实用的权限管理 对多数网站来说,使用完整的rbac权限管理杀鸡用牛刀绝对的吃力不讨好,因为我们只是简单分角色然后对角色进行管理行使其相对于的角色赋予的权限; 在实际的开发中用位运算来对权限进行验证是十 ...
- 3G中的A-GPS移动定位技术
位置业务(LBS,Location Based Service)是指移动网络通过特定的定位技术来获取移动终端的位置信息,从而为终端用户提供附加服务的一种增值业务,可广泛应用于紧急救援.导航追踪.运输调 ...
- YTU 2296: KMP模式匹配 二(串)
2296: KMP模式匹配 二(串) 时间限制: 1 Sec 内存限制: 128 MB 提交: 29 解决: 17 题目描述 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成 ...
- jar的下载地址及其使用说明
有时候会苦于jar的搜索.这里我就给出我平时用到的吧,方便大家.后期会不断添加. 1.dom4j-1.6.1.jar 主要用于解析xml的jar包.下载地址: http://pan.baidu.c ...
- SlickGrid example 1: 最简单的例子和用法
SlickGrid例子和用法 开始学习使用SlickGrid,确实挺好用,挺方便的. 官网地址: https://github.com/mleibman/SlickGrid 不多说,先上效果图. 上代 ...
- java基础:网络编程TCP,URL
获取域名的两种方法: package com.lanqiao.java.test; import java.net.InetAddress;import java.net.UnknownHostExc ...
- MySQL 及 SQL 注入
如果您通过网页获取用户输入的数据并将其插入一个MySQL数据库,那么就有可能发生SQL注入安全的问题. 本章节将为大家介绍如何防止SQL注入,并通过脚本来过滤SQL中注入的字符. 所谓SQL注入,就是 ...
- ubuntu查看内存占用和查看cpu使用情况的简单方法(ubuntu内存管理)
单独查看内存使用情况的命令:free -m查看内存及cpu使用情况的命令:top也可以安装htop工具,这样更直观,安装命令如下:sudo apt-get install htop安装完后,直接输入命 ...
- ByteBuffer解析
一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是 ...
- #pragma 的使用
#pragma 的使用 尽管 C 和 C++ 都已经有标准,但是几乎每个编译器 (广义,包含连接器等) 扩展一些 C/C++ 关键字. 合理地应用这些关键字,有时候能使我们的工作非常方便.下面随便说说 ...