前言

一直在用板子,然后考虑到有些细节还不是很清楚,就整理一下吧。然后没有按板子来写,但是思想基本一致,因为我的板子是每四位合并成一位,也就是将大数看做一个100001000010000进制数

构造和输出

大数一位位地输入比较慢,因此一般采用字符串输入,然后将字符串转化为大数

注意需要从后向前存,运算时从前向后运算,输出时从后向前输出

const int maxn=1005;struct BigInt{int a[maxn];int len;BigInt(){ len=1; memset(a,0,sizeof a); }BigInt(char *s){len=strlen(s);int cnt=0;for(int i=len-1;i>=0;i--) a[cnt++]=s[i]-'0';}BigInt(string s){len=s.size();int cnt=0;for(int i=len-1;i>=0;i--) a[cnt++]=s[i]-'0';}BigInt& operator = (const BigInt &T){   //重载赋值运算符,大数之间进行赋值运算len=T.len;memset(a,0,sizeof(a));for(int i=0;i<len;i++)a[i]=T.a[i];return *this;}void println(){for(int i=len-1;i>=0;i--) printf("%d",a[i]);puts("");}void print(){for(int i=len-1;i>=0;i--) printf("%d",a[i]);}
};

逻辑比较

>

bool operator > (const BigInt &T) const {if(len>T.len) return 1;if(len<T.len) return 0;int cur=len-1;while(a[cur]==T.a[cur] && cur>=0) cur--;if(cur>=0 && a[cur]>T.a[cur]) return 1;else return 0;
}

<

bool operator < (const BigInt &T) const {if(len<T.len) return 1;if(len>T.len) return 0;int cur=len-1;while(a[cur]==T.a[cur] && cur>=0) cur--;if(cur>=0 && a[cur]<T.a[cur]) return 1;else return 0;
}

==

bool operator == (const BigInt &T) const {if(len!=T.len) return 0;for(int i=len-1;i>=0;i--)if(a[cur]!=T.a[cur]) return 0;return 1;
}

四则运算

大数加法

实际上就是对每一位相加并处理进位即可

BigInt operator + (const BigInt &T) const {BigInt ret=T;int maxlen=len>T.len?len:T.len;  //取长度最长的那个for(int i=0;i<maxlen;i++){ret.a[i]+=a[i];if(ret.a[i]>=10){ret.a[i+1]++;ret.a[i]-=10;}}ret.len=ret.a[maxlen]>0?maxlen+1:maxlen;return ret;
}

大数减法

BigInt operator - (const BigInt &T) const {BigInt t1,t2;bool flag;if(*this>T){  //取得最大数并标记首位是否为负t1=*this,t2=T;flag=0;}else{t1=T,t2=*this;flag=1;}int maxlen=t1.len;for(int i=0;i<maxlen;i++){if(t1.a[i]<t2.a[i]){  //需要向前借位int j=i+1;while(t1.a[i]==0) j++;t1.a[j--]--;while(j>i) t1.a[j--]=9;t1.a[i]+=10-t2.a[i];}else t1.a[i]-=t2.a[i];}while(t1.a[maxlen-1]==0 && t1.len>1){   //看看从最高位开始是否被借位变为0t1.len--;maxlen--;}if(flag) t1.a[maxlen-1]=-t1.a[maxlen-1]; //处理首位的正负return t1;
}

大数乘法

BigInt operator * (const BigInt &T) const {BigInt ret;int i,j,temp1,temp2,up;for(i=0;i<len;i++){up=0;for(j=0;j<T.len;j++){temp1=a[i]*T.a[j]+ret.a[i+j]+up;if(temp1>=10){temp2=temp1-temp1/10*10;up=temp1/10;ret.a[i+j]=temp2;}else{up=0;ret.a[i+j]=temp1;}}if(up) ret.a[i+j]=up;  //向最高位的进位是否存在}ret.len=len+T.len;while(ret.a[ret.len-1]==0 && ret.len>1) ret.len--;  //处理前导0return ret;
}

大数除法

BigInt operator / (const int &b) const {BigInt ret;int down=0;for(int i=len-1;i>=0;i--){ret.a[i]=(a[i]+down*10)/b;down=a[i]+down*10-ret.a[i]*b;}ret.len=len;while(ret.a[ret.len-1]==0 && ret.len>1) ret.len--;return ret;
}

其他操作

大数取模

以4343%343为例:

然后我们可以发现实际上需要的是对每一位依次取模,并加上来自高位的余数乘以十

int operator % (const int &b) const {int ret=0;for(int i=len-1;i>=0;i--)ret=(ret*10+a[i])%b;return ret;
}

大数求幂

BigInt pow(int n){   //传入的n非负BigInt x=*this,ret("1");while(n) {if(n&1) ret=ret*x;x=x*x;n>>=1;}return ret;
}

C++大数BigInt相关推荐

  1. HDU 4927 大数运算

    模板很重要 #include <cstdio> #include <cstring> #include <cstdlib> #include <iostrea ...

  2. ACdream 1210 Chinese Girls' Amusement

    题目链接:http://115.28.76.232/problem?pid=1210 Problem Description You must have heard that the Chinese ...

  3. Bigint Multiplication:大数乘法(hihoCoder C++)

    Bigint Multiplication 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Given 2 nonnegative integers a and b, c ...

  4. 从数据类型 nvarchar 转换为 bigint 时出错_JavaScript数据类型的一些细节点

    ▲ 点击上方蓝字关注我 ▲文 / 景朝霞来源公号 / 朝霞的光影笔记ID / zhaoxiajingjing图 / 自己画 目录JS数据类型的一些细节点0 / JS 中的数据类型的一些细节点(1)JS ...

  5. C++ BigInt模板手打

    参考邝斌的模板 模拟整数,大整数对象的数据成员应该有两个 1:存放数字的数组,(常用字符类型存放1位数字,这里用int类型存放4位数字(当然也可以8位,不过参数需要用longlong才能保证乘法不超过 ...

  6. ACM JAVA大数

    有的水题自己模拟下大数就过了,有的各种坑,天知道曾经因为大数wa了多少次....自己最近学者用JAVA,下面是自己总结的JAVA常用知识.. 框架 import java.util.Scanner; ...

  7. 面试题整理3 大数的表示及加减法问题

    在<剑指offer>面试题12中指出大数的表示时一般用字符串,用一个char型字符表示十进制数的一位.但是一个char类型最多能够表示256个字符,而十进制数只有0~9的10个数字,这样造 ...

  8. javascript json_JavaScript 之 JSON.parse 导致大数精度丢失问题的解决方案

    JavaScript 精度的问题时不时就会出现在前端开发面前,这里讨论的是大数精度丢失的问题 问题复现 前端向服务端请求某个订单数据,其中订单号 18 位,在数据库中以数字的形式保存,服务端查询数据库 ...

  9. C++实现大数加减法

    本代码可以获取命令行输入的数字和加减运算 因为较大整数的相加很可能超出整型的32位限制,或者本身就是超出限制的大数之间的加减运算. 所以我们需要单独写一个能大数相加减的函数 基本原理:把数字用字符串的 ...

最新文章

  1. 出身寒门,如何改变命运?
  2. c语言链表拆分,C语言拆分链表程序
  3. Filter学习(一)
  4. 数据网络卡顿怎么处理_监控网络卡顿怎么办
  5. 上拉加载 php,php+jquery 上拉加载
  6. 《防患未然:实施情报先导的信息安全方法与实践》——2.8 小结
  7. setitimer 创建两个定时器_UE4 Timer(定时器)相关源码分析
  8. 虚拟服务器 端口管理,Apache服务配置虚拟主机(基于域名、端口、IP地址)与简单访问权限管理...
  9. UIButton的创建与释放问题
  10. oracle 清除数据库缓存
  11. java web部署文档_javaweb项目实施部署文档
  12. logisim基础(非常基础)----寄存器元件的使用
  13. Ubuntu彻底卸载MySQL
  14. aforge 相机标定_在C#和WPF中使用Aforge.NET获取网络摄像头流
  15. 三种教鞭工具使用对比
  16. html格式蠕虫病毒,XiaoBa自制蠕虫病毒[2018-1-10]
  17. 友盟 android版本统计,友盟统计下载_友盟统计安卓版下载_友盟统计手机版下载_友盟统计app_易玩网...
  18. linux文件夹建立软连接,软连接 - Linux软连接创建及一个“坑”
  19. 软考高级 真题 2015年下半年 信息系统项目管理师 综合知识
  20. 华为云在Linux ECS上使用obsutil通过内网访问OBS

热门文章

  1. hexo的next主题个性化配置
  2. CSS阴影的那些事儿
  3. 罗技键盘+android风格,罗技这款好看轻便的蓝牙键盘,让你在电脑手机间无缝切换...
  4. OJ 1215 在披萨店里的思考
  5. 九思OA办公系统全景图揭秘
  6. Android 获取屏幕高度
  7. word中插入空白页!
  8. 视频滤镜软件哪个好?推荐几个视频滤镜软件给你
  9. 值得一用的Windows磁盘空间分析工具——WizTree
  10. 拼多多发布商家信用管理规则,为守信经营者保驾护航