HDU 4927 大数运算
模板很重要
![](/assets/blank.gif)
![](/assets/blank.gif)
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define MAXN 9999 #define MAXSIZE 10 #define DLEN 4class BigInt { private: int a[500]; //可以控制大数的位数 int len; //大数长度 public: BigInt(){ len = 1;memset(a,0,sizeof(a)); } //构造函数BigInt(const int); //将一个int类型的变量转化为大数BigInt(const char*); //将一个字符串类型的变量转化为大数BigInt(const BigInt &); //拷贝构造函数BigInt &operator=(const BigInt &); //重载赋值运算符,大数之间进行赋值运算 friend istream& operator>>(istream&, BigInt&); //重载输入运算符friend ostream& operator<<(ostream&, BigInt&); //重载输出运算符 BigInt operator+(const BigInt &) const; //重载加法运算符,两个大数之间的相加运算 BigInt operator-(const BigInt &) const; //重载减法运算符,两个大数之间的相减运算 BigInt operator*(const BigInt &) const; //重载乘法运算符,两个大数之间的相乘运算 BigInt operator/(const int &) const; //重载除法运算符,大数对一个整数进行相除运算 BigInt operator^(const int &) const; //大数的n次方运算int operator%(const int &) const; //大数对一个int类型的变量进行取模运算 bool operator>(const BigInt & T)const; //大数和另一个大数的大小比较bool operator<(const BigInt & T) const;bool operator==(const BigInt & T) const;bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较bool operator<(const int &t) const;bool operator==(const int &t) const; void print(); //输出大数 }; bool BigInt::operator==(const BigInt & T) const {return !(*this > T) && !(T > *this); } bool BigInt::operator==(const int &t) const {BigInt T = BigInt(t);return *this == T; } bool BigInt::operator<(const BigInt & T) const {return T > *this; } bool BigInt::operator<(const int &t) const {return BigInt(t) > *this; } BigInt::BigInt(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; } BigInt::BigInt(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;} } BigInt::BigInt(const BigInt & T) : len(T.len) //拷贝构造函数 { int i; memset(a,0,sizeof(a)); for(i = 0 ; i < len ; i++)a[i] = T.a[i]; } BigInt & BigInt::operator=(const BigInt & 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, BigInt & 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, BigInt& 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; }BigInt BigInt::operator+(const BigInt & T) const //两个大数之间的相加运算 {BigInt 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; elset.len = big; return t; } BigInt BigInt::operator-(const BigInt & T) const //两个大数之间的相减运算 { int i,j,big;bool flag;BigInt 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]; } elset1.a[i] -= t2.a[i];}t1.len = big;while(t1.a[t1.len - 1] == 0 && t1.len > 1){t1.len--;big--;}if(flag)t1.a[big-1]=0-t1.a[big-1];return t1; } BigInt BigInt::operator*(const BigInt & T) const //两个大数之间的相乘运算 { BigInt 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; } BigInt BigInt::operator/(const int & b) const //大数对一个整数进行相除运算 { BigInt 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 BigInt::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; } BigInt BigInt::operator^(const int & n) const //大数的n次方运算 {BigInt 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 BigInt::operator>(const BigInt & 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; elsereturn false; } elsereturn false; } bool BigInt::operator >(const int & t) const //大数和一个int类型的变量的大小比较 {BigInt b(t);return *this>b; }void BigInt::print() //输出大数 { int i; printf("%d", a[len-1]);for (int i = len-2; i >= 0; --i) {printf("%04d", a[i]);}puts(""); } int main() {//freopen("1007.in","r",stdin);int tt,n,a[3005];scanf("%d",&tt);while(tt--){scanf("%d",&n);BigInt Z(1),ans(0),tmp;bool zheng=1;for(int i=1; i<=n; i++)scanf("%d",&a[i]);for(int i=0; i<=n-1; i++){if(i>0) Z=(Z*(BigInt)(n-i))/i;if(i%2==0){tmp=Z*(BigInt)(a[n-i]);if(zheng)ans=ans+tmp;else{if(ans<tmp){ans=tmp-ans;zheng=1;}elseans=ans-tmp;}}else{tmp=(Z*(BigInt)(a[n-i]));if(zheng){if(ans<tmp){ans=tmp-ans;zheng=0;}elseans=ans-tmp;}elseans=ans+tmp;}}if(!zheng) cout<<'-';ans.print();}return 0; }
View Code
转载于:https://www.cnblogs.com/Mathics/p/3897937.html
HDU 4927 大数运算相关推荐
- 多校第六场 HDU 4927 JAVA大数类+模拟
HDU 4927 题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1−ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小 ...
- C语言实现大数运算(长整数的加、减、乘、除)
由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 .大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算. 简单表 ...
- C语言学习趣事_之_大数运算_加法
C语言学习趣事_大数运算_之加法 1.引子 在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...
- java中大数开方_Java中的大数运算
# 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...
- Openssl 之大数运算函数 BN
Openssl 之大数运算函数 BN 主要介绍Openssl中的有关大数运算函数,这个对于RSA研究和实现比较有价值 1.初始化函数 BIGNUM *BN_new(void); 新生成一个B ...
- 【PAT甲级 大数运算】1065 A+B and C (64bit) (20 分) Python 全部AC
题目 初学python,第一次用python刷oj,挑了个简单题试试手. 在大数运算方面,python没有数的大小限制,简直开挂. total = int(input()) for i in rang ...
- Java的学习与java大数运算
之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...
- 备忘: MIRACL 大数运算库使用手册
<MIRACL 大数运算库使用手册> 作者: 游贵荣 中文使用手册: http://blog.csdn.net/shuilan0066/article/details/8520337htt ...
- 算法之大数运算加减法源代码
很多小伙伴对计算机编程的算法感兴趣,但在很多竞赛类算法网站中,大数运算往往是必考的,而课本有基本未提及,所以,今天来提供算法的基本运算的源码(加减). 对于大多数大数运算,往往是超出int 的范围,比 ...
最新文章
- 【IT笔试面试题整理】删除无序链表中重复的节点
- 【Python】Python2.7.15 - Windows安装Python以及Python安装目录结构详解
- (54)Verilog HDL下升沿采样
- qml tableview 滚动条加宽_qt qtableview 样式设置
- ssh localhost报错解决:ubuntu@localhost: Permission denied (publickey).
- Visual Studio附加调试进程时找不到
- NYOJ题目325-zb的生日
- python爬取qq音乐歌曲
- Silktest试用笔记
- ubuntu18.04声音dummy output的问题
- java实现滑动验证码
- godoc使用方法介绍
- MySQL 之 ROUND 函数四舍五入的陷阱
- js ,DOM节点,制作点名器
- JavaScript是多线程还是单线程?
- 解决 ffmpeg yasm not found, use --disable-yasm for a crippled build
- 一文深入浅出理解国产开源木兰许可系列协议
- 轻松搞定java高薪
- 大白话 六问数据中台!你想知道的都在这了!
- HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION翻译
热门文章
- spacy 英文模型下载_spaCy2.1中文模型包
- linux中检测用户信息的命令是,Linux中系统状态检测命令
- 使用plsql创建oracle,在Oracle下使用PLSQL Developer创建简单的触发器
- mysql的orm框架_Mysql-Sqlalchemy-ORM框架
- 数据双向绑定_手写 Vue3 数据双向绑定 理解Proxy
- ESXi 6.7 的https服务挂掉处理方法 503 Service Unavailable (Failed to connect to endpoint: [N7Vmacore4Http16Loc
- 安装VCSA6.5(vCenter Server Appliance 6.5)
- Java基础学习总结(120)——JVM 参数使用详细说明
- Nginx学习总结(6)——Nginx + https + 免费SSL证书配置指南
- Java基础学习总结(41)——JPA常用注解