C++大数运算模板
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<iomanip>
- #include<algorithm>
- using namespace std;
- #define MAXN 9999
- #define MAXSIZE 10
- #define DLEN 4
- class BigNum
- {
- private:
- int a[1500]; //可以控制大数的位数
- int len; //大数长度
- public:
- BigNum(){ len = 1;memset(a,0,sizeof(a)); } //构造函数
- BigNum(const int); //将一个int类型的变量转化为大数
- BigNum(const char*); //将一个字符串类型的变量转化为大数
- BigNum(const BigNum &); //拷贝构造函数
- BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
- friend istream& operator>>(istream&, BigNum&); //重载输入运算符
- friend ostream& operator<<(ostream&, BigNum&); //重载输出运算符
- BigNum operator+(const BigNum &) const; //重载加法运算符,两个大数之间的相加运算
- BigNum operator-(const BigNum &) const; //重载减法运算符,两个大数之间的相减运算
- BigNum operator*(const BigNum &) const; //重载乘法运算符,两个大数之间的相乘运算
- BigNum operator/(const int &) const; //重载除法运算符,大数对一个整数进行相除运算
- BigNum operator^(const int &) const; //大数的n次方运算
- int operator%(const int &) const; //大数对一个int类型的变量进行取模运算
- bool operator>(const BigNum & T)const; //大数和另一个大数的大小比较
- bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较
- void print(); //输出大数
- };
- BigNum::BigNum(const int b) //将一个int类型的变量转化为大数
- {
- int c,d = b;
- len = 0;
- memset(a,0,sizeof(a));
- while(d > MAXN)
- {
- c = d - (d / (MAXN + 1)) * (MAXN + 1);
- d = d / (MAXN + 1);
- a[len++] = c;
- }
- a[len++] = d;
- }
- BigNum::BigNum(const char*s) //将一个字符串类型的变量转化为大数
- {
- int t,k,index,l,i;
- memset(a,0,sizeof(a));
- l=strlen(s);
- len=l/DLEN;
- if(l%DLEN)
- len++;
- index=0;
- for(i=l-1;i>=0;i-=DLEN)
- {
- t=0;
- k=i-DLEN+1;
- if(k<0)
- k=0;
- for(int j=k;j<=i;j++)
- t=t*10+s[j]-'0';
- a[index++]=t;
- }
- }
- BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数
- {
- int i;
- memset(a,0,sizeof(a));
- for(i = 0 ; i < len ; i++)
- a[i] = T.a[i];
- }
- BigNum & BigNum::operator=(const BigNum & n) //重载赋值运算符,大数之间进行赋值运算
- {
- int i;
- len = n.len;
- memset(a,0,sizeof(a));
- for(i = 0 ; i < len ; i++)
- a[i] = n.a[i];
- return *this;
- }
- istream& operator>>(istream & in, BigNum & b) //重载输入运算符
- {
- char ch[MAXSIZE*4];
- int i = -1;
- in>>ch;
- int l=strlen(ch);
- int count=0,sum=0;
- for(i=l-1;i>=0;)
- {
- sum = 0;
- int t=1;
- for(int j=0;j<4&&i>=0;j++,i--,t*=10)
- {
- sum+=(ch[i]-'0')*t;
- }
- b.a[count]=sum;
- count++;
- }
- b.len =count++;
- return in;
- }
- ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符
- {
- int i;
- cout << b.a[b.len - 1];
- for(i = b.len - 2 ; i >= 0 ; i--)
- {
- cout.width(DLEN);
- cout.fill('0');
- cout << b.a[i];
- }
- return out;
- }
- BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算
- {
- BigNum t(*this);
- int i,big; //位数
- big = T.len > len ? T.len : len;
- for(i = 0 ; i < big ; i++)
- {
- t.a[i] +=T.a[i];
- if(t.a[i] > MAXN)
- {
- t.a[i + 1]++;
- t.a[i] -=MAXN+1;
- }
- }
- if(t.a[big] != 0)
- t.len = big + 1;
- else
- t.len = big;
- return t;
- }
- BigNum BigNum::operator-(const BigNum & T) const //两个大数之间的相减运算
- {
- int i,j,big;
- bool flag;
- BigNum t1,t2;
- if(*this>T)
- {
- t1=*this;
- t2=T;
- flag=0;
- }
- else
- {
- t1=T;
- t2=*this;
- flag=1;
- }
- big=t1.len;
- for(i = 0 ; i < big ; i++)
- {
- if(t1.a[i] < t2.a[i])
- {
- j = i + 1;
- while(t1.a[j] == 0)
- j++;
- t1.a[j--]--;
- while(j > i)
- t1.a[j--] += MAXN;
- t1.a[i] += MAXN + 1 - t2.a[i];
- }
- else
- t1.a[i] -= t2.a[i];
- }
- t1.len = big;
- while(t1.a[len - 1] == 0 && t1.len > 1)
- {
- t1.len--;
- big--;
- }
- if(flag)
- t1.a[big-1]=0-t1.a[big-1];
- return t1;
- }
- BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算
- {
- BigNum ret;
- int i,j,up;
- int temp,temp1;
- for(i = 0 ; i < len ; i++)
- {
- up = 0;
- for(j = 0 ; j < T.len ; j++)
- {
- temp = a[i] * T.a[j] + ret.a[i + j] + up;
- if(temp > MAXN)
- {
- temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);
- up = temp / (MAXN + 1);
- ret.a[i + j] = temp1;
- }
- else
- {
- up = 0;
- ret.a[i + j] = temp;
- }
- }
- if(up != 0)
- ret.a[i + j] = up;
- }
- ret.len = i + j;
- while(ret.a[ret.len - 1] == 0 && ret.len > 1)
- ret.len--;
- return ret;
- }
- BigNum BigNum::operator/(const int & b) const //大数对一个整数进行相除运算
- {
- BigNum ret;
- int i,down = 0;
- for(i = len - 1 ; i >= 0 ; i--)
- {
- ret.a[i] = (a[i] + down * (MAXN + 1)) / b;
- down = a[i] + down * (MAXN + 1) - ret.a[i] * b;
- }
- ret.len = len;
- while(ret.a[ret.len - 1] == 0 && ret.len > 1)
- ret.len--;
- return ret;
- }
- int BigNum::operator %(const int & b) const //大数对一个int类型的变量进行取模运算
- {
- int i,d=0;
- for (i = len-1; i>=0; i--)
- {
- d = ((d * (MAXN+1))% b + a[i])% b;
- }
- return d;
- }
- BigNum BigNum::operator^(const int & n) const //大数的n次方运算
- {
- BigNum t,ret(1);
- int i;
- if(n<0)
- exit(-1);
- if(n==0)
- return 1;
- if(n==1)
- return *this;
- int m=n;
- while(m>1)
- {
- t=*this;
- for( i=1;i<<1<=m;i<<=1)
- {
- t=t*t;
- }
- m-=i;
- ret=ret*t;
- if(m==1)
- ret=ret*(*this);
- }
- return ret;
- }
- bool BigNum::operator>(const BigNum & T) const //大数和另一个大数的大小比较
- {
- int ln;
- if(len > T.len)
- return true;
- else if(len == T.len)
- {
- ln = len - 1;
- while(a[ln] == T.a[ln] && ln >= 0)
- ln--;
- if(ln >= 0 && a[ln] > T.a[ln])
- return true;
- else
- return false;
- }
- else
- return false;
- }
- bool BigNum::operator >(const int & t) const //大数和一个int类型的变量的大小比较
- {
- BigNum b(t);
- return *this>b;
- }
- void BigNum::print() //输出大数
- {
- int i;
- cout << a[len - 1];
- for(i = len - 2 ; i >= 0 ; i--)
- {
- cout.width(DLEN);
- cout.fill('0');
- cout << a[i];
- }
- cout << endl;
- }
使用时直接 BigNum a,b,c; 可定义大数直接进行运算
C++大数运算模板的更多相关文章
- java的大数运算模板
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(S ...
- 大数运算(python2)
偶然又遇到了一道大数题,据说python大数运算好屌,试了一发,果然方便-1 a = int( raw_input() ); //注意这里是按行读入的,即每行只读一个数 b = int( raw_in ...
- 收藏的一段关于java大数运算的代码
收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...
- [PKU2389]Bull Math (大数运算)
Description Bulls are so much better at math than the cows. They can multiply huge integers together ...
- hdu_1041(Computer Transformation) 大数加法模板+找规律
Computer Transformation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- java 大数运算[转]
用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...
- A+B大数运算
基础加法大数运算: [https://vjudge.net/problem/HDU-1002] 题目: 输入两个长度不超过1000的整数求出sum. 思路: 由于数字很大不能直接加,用字符串形式输入, ...
- HOJ 2148&POJ 2680(DP递推,加大数运算)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4561 Accepted: 17 ...
- 九度OJ 1051:数字阶梯求和 (大数运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6718 解决:2280 题目描述: 给定a和n,计算a+aa+aaa+a...a(n个a)的和. 输入: 测试数据有多组,输入a,n(1&l ...
随机推荐
- 生活中需要一台mac本子
用了好多年的windows系统,各种快捷键玩得飞起.当时对mac笔记本的印象就是. mac本子好高大上,搞设计的人才会去用的.(这个也是我听其他人说的) 在当时公司搞IOS开发的人中,面对这个高大上的 ...
- navicat 链接阿里云服务器数据库报80070007 的错误
navicat用ssh跳转登录mysql连接时报: 80070007: SSH Tunnel: Server does not support diffie-hellman-group1-sha1 f ...
- UOJ#470. 【ZJOI2019】语言 虚树,线段树合并
原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两 ...
- CF1207题解
D 全排列减去坏序列 坏序列分三种,容斥一下就好了 E 比较有意思 \(A=_{i=1}^{100}\{i\},B=_{i=1}^{100}\{i\cdot 2^7\}\),所以\(A_i~xor~ ...
- Python 之pyinstaller模块打包成exe文件
一.安装pyinstaller pip install pyinstaller 二.下载安装pyinstaler运行时所需要的windows扩展pywin32 https://github.com/m ...
- K8S中POD节点状态ContainerCreating原因排查
现象: # kubectl get pods -n kube-system |grep dashboard kubernetes-dashboard-6685cb584f-dqkwk 0/1 Cont ...
- 数据结构Java版之二叉查找树(七)
二叉查找树(BST : BInary Search Tree) 二叉查找树的性质: 1.每一个元素有一个键值 2.左子树的键值都小于根节点的键值 3.右子树的键值都大于根节点的键值 4.左右子树都是二 ...
- 优雅地使用eruda在移动端上调试网页
注:本文有一小部分截图为桌面端,但所有内容都亲测在移动端上可用. 你曾否在洛谷上用<F12>把错的数据点改成AC?是否有过自己尝试搭建网站,在移动端上js代码运行出错?如果你的回答是肯定的 ...
- 团队作业-Alpha(1/4)
队名:软工9组 组长博客: https://www.cnblogs.com/cmlei/ 作业博客: 组员进度 ● 组员一(组长) 陈明磊 ○过去两天完成了哪些任务 ●文字/口头描述 初步学习flas ...
- Software Project Management_JUnit && Maven
Task1: Develop the project “HelloWorld” -A .java program: Just print out “Hello” + your name; -A tes ...