C++高精度整数加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的。
其中高精度除法返回一对string,分别表示商和余数。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int a[maxn], b[maxn], res[maxn];
string add(string s1, string s2) { // under condition: s1,s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = max(n, m) + 1;
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < len; i ++) {
res[i] += a[i] + b[i];
if (res[i] >= 10) {
res[i+1] += res[i] / 10;
res[i] %= 10;
}
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
}
string sub(string s1, string s2) { // under condition: s1>=s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = max(n, m);
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < len; i ++) {
res[i] += a[i] - b[i];
if (res[i] < 0) {
res[i+1] --;
res[i] += 10;
}
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
}
bool cmp(string s1, string s2) { // under condition: s1,s2 >= 0
int n = s1.length(), m = s2.length();
int i;
for (i = 0; i < n-1 && s1[i] == '0'; i ++);
s1 = s1.substr(i);
for (i = 0; i < m-1 && s2[i] == '0'; i ++);
s2 = s2.substr(i);
if (s1.length() != s2.length()) return s1.length() < s2.length();
return s1 < s2;
}
string Add(string s1, string s2) {
if (s1[0] == '-' && s2[0] == '-') {
return "-" + add(s1.substr(1), s2.substr(1));
}
else if (s1[0] == '-') {
s1 = s1.substr(1);
if (cmp(s1, s2) == true) {
return sub(s2, s1);
} else {
return "-" + sub(s1, s2);
}
}
else if (s2[0] == '-') {
s2 = s2.substr(1);
if (cmp(s1, s2) == true) {
return "-" + sub(s2, s1);
} else {
return sub(s1, s2);
}
}
else {
return add(s1, s2);
}
}
string Sub(string s1, string s2) {
if (s2[0] == '-') {
s2 = s2.substr(1);
return Add(s1, s2);
}
else {
return Add(s1, "-" + s2);
}
}
string multi(string s1, string s2) { // under condition: s1,s2>=0
// 初始化部分
int n = s1.length(), m = s2.length();
for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
int len = n + m;
for (int i = n; i < len; i ++) a[i] = 0;
for (int i = m; i < len; i ++) b[i] = 0;
for (int i = 0; i < len; i ++) res[i] = 0;
// 处理部分
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
res[i+j] += a[i] * b[j];
for (int i = 0; i < len; i ++) {
res[i+1] += res[i] / 10;
res[i] %= 10;
}
// 返回部分
int i = len-1;
while (res[i] == 0 && i > 0) i --;
string s = "";
for (; i >= 0; i --) {
char c = (char) (res[i] + '0');
s += c;
}
return s;
}
pair<string, string> divide(string s1, string s2) { // under condition: s1>=0,s2>0
string s = "", t = "";
int n = s1.length(), m = s2.length();
bool flag = false;
for (int i = 0; i < n; i ++) {
s += s1[i];
int num = 0;
while (cmp(s, s2) == false) {
num ++;
s = sub(s, s2);
}
if (num > 0) {
flag = true;
char c = (char)(num + '0');
t += c;
}
else if (flag) {
t += '0';
}
}
if (t.length() == 0) t = "0";
while (s[0] == '0' && s.length() > 1) s = s.substr(1);
return make_pair(t, s);
}
string s1, s2;
int main() {
while (cin >> s1 >> s2) {
cout << "add:\t" << Add(s1, s2) << endl;
cout << "sub:\t" << Sub(s1, s2) << endl;
cout << "multi:\t" << multi(s1, s2) << endl;
pair<string, string> divide_pair = divide(s1, s2);
cout << "divide:\t" << divide_pair.first << " ...... " << divide_pair.second << endl;
}
return 0;
}
测试数据:
100 9
add: 109
sub: 91
multi: 900
divide: 11 ...... 1
1000000 87
add: 1000087
sub: 999913
multi: 87000000
divide: 11494 ...... 22
C++高精度整数加减乘除模板的更多相关文章
- Java 实现大整数加减乘除
自己用Java实现的大整数加减乘除运算.还有可以改进的地方,有兴趣的童鞋可以加以改进.仅供参考,请勿转载! package barrytest; import java.util.ArrayList; ...
- Java中的高精度整数和高精度小数
在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差: 在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误 ...
- 高精度整数 - a+b(王道)
题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出: 可能有多组测试数据,对于每组数据,输出a+b的值 样例输入: 2 6 1 ...
- Pollard-Rho大整数拆分模板
随机拆分,简直机智. 关于过程可以看http://wenku.baidu.com/link?url=JPlP8watmyGVDdjgiLpcytC0lazh4Leg3s53WIx1_Pp_Y6DJTC ...
- ACM高精度加减乘除模板
[转]#include <iostream> #include <string> using namespace std; inline int compare(string ...
- C++高精度加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- PAT A1024题解——高精度大数相加模板
PAT:A1024 Palindromic Number A number that will be the same when it is written forwards or backwards ...
- POJ 1504 Adding Reversed Numbers (水题,高精度整数加法)
题意:给两个整数,求这两个数的反向数的和的反向数,和的末尾若为0,反向后则舍去即可.即若1200,反向数为21.题目给出的数据的末尾不会出现0,但是他们的和的末尾可能会出现0. #include &l ...
- ALU底层方法及计算机整数加减乘除模拟
ALU是计算机CPU的核心,即 算术逻辑单元(arithmetic and logic unit)ALU有几大功能,是计算机计算最基础的功能:1.算术运算:包含加法.减法等2.逻辑运算:主要是布尔运算 ...
随机推荐
- 【转载】Mixed mode assembly is built against version 'v2.0.50727' of the runtime and cannot be loaded in the 4.0 runtime without additional configuration info
网上查到http://social.msdn.microsoft.com/Forums/vstudio/en-US/58271e39-beca-49ac-90f9-e116fa3dd3c0/mxed- ...
- Spring入门(三)——AOP
1. AOP aspect object programming ,简单来说就是把重复的代码抽取出来,然后再需要用到的地方进行切入,这里讲解基于接口的注解实现 2. 了解 关注点:即重复的代码 切面: ...
- webuploader+php如何实现分片+断点续传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- editplus 支持lua语言语法高亮显示
找到自己的安装目录 建一个这个名字的文件 里面写上 #TITLE=LUA ; LUA syntax file written by ES-Computing. ; This file is requi ...
- 用SAM实现后缀排序
因为本人几乎不会后缀数组,所以遇到这种SA的模板题也要拿SAM解决. 还是有一点思维难度的. 首先按照国际惯例,建反串的SAM. 然后对于这个反串,我们考虑两个前缀哪一个字典序小:因为是串是反的,所以 ...
- 【dp】P1026 统计单词个数
题目描述 给出一个长度不超过200200的由小写英文字母组成的字母串(约定;该字串以每行2020个字母的方式输入,且保证每行一定为2020个).要求将此字母串分成kk份(1<k \le 401& ...
- 【MySQL 读书笔记】“order by”是怎么工作的?
针对排序来说,order by 是我们使用非常频繁的关键字.结合之前我们对索引的了解再来看这篇文章会让我们深刻理解在排序的时候,是如何利用索引来达到少扫描表或者使用外部排序的. 先定义一个表辅助我们后 ...
- [RK3399] ES8316+NS4150 播放视频只有背景音,播放歌曲有的有声音,有的无声音
CPU:RK3399 系统:Android 音频IC:ES8316 功放IC:NS4150 以前也在 RK3399 上调试过 ES8316,功能都正常,新主板只是更换了功放IC,就出现无声音的问题(仔 ...
- RabbitMQ Management API调用
RabbitMQ在运行时,偶尔会有一些死信,即消息未正常消费,造成消息积压在消息队列中, 一直卡住,重复循环消费原来的消息队列 那么就需要有一种机制,来查看RabbitMQ是否有消息未正常消费,从而让 ...
- if ( ! defined('BASEPATH')) exit('No direct script access allowed')的作用
在看源代码时,发现codeigniter框架的控制器中,总是加上这样一段话: if(!defined('BASEPATH'))exit('No direct script access allowed ...