模板很重要

#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 大数运算相关推荐

  1. 多校第六场 HDU 4927 JAVA大数类+模拟

    HDU 4927 题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1−ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小 ...

  2. C语言实现大数运算(长整数的加、减、乘、除)

    由于整型数的位数有限,因此整型数不能满足大整数(超长整数)的运算要求 .大整数计算是利用字符串来表示大整数,即用字符串的一位字符表示大整数的一位数值,然后根据四则运算规则实现大整数的四则运算. 简单表 ...

  3. C语言学习趣事_之_大数运算_加法

    C语言学习趣事_大数运算_之加法 1.引子    在C语言中,因为预定义的自然数类型的大小是有上下限度的,这就决定了在进行数的运算的时候,必然受到限制,同时因为C语言是最接近汇编的一种程序设计语言,并 ...

  4. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

  5. Openssl 之大数运算函数 BN

    Openssl 之大数运算函数 BN 主要介绍Openssl中的有关大数运算函数,这个对于RSA研究和实现比较有价值   1.初始化函数 BIGNUM *BN_new(void);    新生成一个B ...

  6. 【PAT甲级 大数运算】1065 A+B and C (64bit) (20 分) Python 全部AC

    题目 初学python,第一次用python刷oj,挑了个简单题试试手. 在大数运算方面,python没有数的大小限制,简直开挂. total = int(input()) for i in rang ...

  7. Java的学习与java大数运算

    之前就学过一点java,但太久没用知识点早就还给书本,之前在实验室搞到一本java的书,今天来重新温习一下 java的语法大部分和c++语言是一样的,入门非常快,所以在这里基础语句的用法就省略了 输出 ...

  8. 备忘: MIRACL 大数运算库使用手册

    <MIRACL 大数运算库使用手册> 作者: 游贵荣 中文使用手册: http://blog.csdn.net/shuilan0066/article/details/8520337htt ...

  9. 算法之大数运算加减法源代码

    很多小伙伴对计算机编程的算法感兴趣,但在很多竞赛类算法网站中,大数运算往往是必考的,而课本有基本未提及,所以,今天来提供算法的基本运算的源码(加减). 对于大多数大数运算,往往是超出int 的范围,比 ...

最新文章

  1. 【IT笔试面试题整理】删除无序链表中重复的节点
  2. 【Python】Python2.7.15 - Windows安装Python以及Python安装目录结构详解
  3. (54)Verilog HDL下升沿采样
  4. qml tableview 滚动条加宽_qt qtableview 样式设置
  5. ssh localhost报错解决:ubuntu@localhost: Permission denied (publickey).
  6. Visual Studio附加调试进程时找不到
  7. NYOJ题目325-zb的生日
  8. python爬取qq音乐歌曲
  9. Silktest试用笔记
  10. ubuntu18.04声音dummy output的问题
  11. java实现滑动验证码
  12. godoc使用方法介绍
  13. MySQL 之 ROUND 函数四舍五入的陷阱
  14. js ,DOM节点,制作点名器
  15. JavaScript是多线程还是单线程?
  16. 解决 ffmpeg yasm not found, use --disable-yasm for a crippled build
  17. 一文深入浅出理解国产开源木兰许可系列协议
  18. 轻松搞定java高薪
  19. 大白话 六问数据中台!你想知道的都在这了!
  20. HIGH-DIMENSIONAL CONTINUOUS CONTROL USING GENERALIZED ADVANTAGE ESTIMATION翻译

热门文章

  1. spacy 英文模型下载_spaCy2.1中文模型包
  2. linux中检测用户信息的命令是,Linux中系统状态检测命令
  3. 使用plsql创建oracle,在Oracle下使用PLSQL Developer创建简单的触发器
  4. mysql的orm框架_Mysql-Sqlalchemy-ORM框架
  5. 数据双向绑定_手写 Vue3 数据双向绑定 理解Proxy
  6. ESXi 6.7 的https服务挂掉处理方法 503 Service Unavailable (Failed to connect to endpoint: [N7Vmacore4Http16Loc
  7. 安装VCSA6.5(vCenter Server Appliance 6.5)
  8. Java基础学习总结(120)——JVM 参数使用详细说明
  9. Nginx学习总结(6)——Nginx + https + 免费SSL证书配置指南
  10. Java基础学习总结(41)——JPA常用注解