ACM高精度加减乘除模板
【转】
#include <iostream> #include <string> using namespace std; inline int compare(string str1, string str2) { if(str1.size() > str2.size()) //长度长的整数大于长度小的整数 return ; else if(str1.size() < str2.size()) return -; else return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1 } //高精度加法 string ADD_INT(string str1, string str2) { string MINUS_INT(string str1, string str2); int sign = ; //sign 为符号位 string str; if(str1[] == '-') { if(str2[] == '-') { sign = -; str = ADD_INT(str1.erase(, ), str2.erase(, )); }else { str = MINUS_INT(str2, str1.erase(, )); } }else { if(str2[] == '-') str = MINUS_INT(str1, str2.erase(, )); else { //把两个整数对齐,短整数前面加0补齐 string::size_type l1, l2; int i; l1 = str1.size(); l2 = str2.size(); if(l1 < l2) { for(i = ; i <= l2 - l1; i++) str1 = "" + str1; }else { for(i = ; i <= l1 - l2; i++) str2 = "" + str2; } int int1 = , int2 = ; //int2 记录进位 for(i = str1.size() - ; i >= ; i--) { int1 = (int(str1[i]) - + int(str2[i]) - + int2) % ; //48 为 '0' 的ASCII码 int2 = (int(str1[i]) - + int(str2[i]) - +int2) / ; str = char(int1 + ) + str; } if(int2 != ) str = char(int2 + ) + str; } } //运算后处理符号位 if((sign == -) && (str[] != '')) str = "-" + str; return str; } //高精度减法 string MINUS_INT(string str1, string str2) { string MULTIPLY_INT(string str1, string str2); int sign = ; //sign 为符号位 string str; if(str2[] == '-') str = ADD_INT(str1, str2.erase(, )); else { int res = compare(str1, str2); if(res == ) return ""; if(res < ) { sign = -; string temp = str1; str1 = str2; str2 = temp; } string::size_type tempint; tempint = str1.size() - str2.size(); for(int i = str2.size() - ; i >= ; i--) { if(str1[i + tempint] < str2[i]) { str1[i + tempint - ] = char(int(str1[i + tempint - ]) - ); str = char(str1[i + tempint] - str2[i] + ) + str; } else str = char(str1[i + tempint] - str2[i] + ) + str; } for(i = tempint - ; i >= ; i--) str = str1[i] + str; } //去除结果中多余的前导0 str.erase(, str.find_first_not_of('')); if(str.empty()) str = ""; if((sign == -) && (str[] != '')) str = "-" + str; return str; } //高精度乘法 string MULTIPLY_INT(string str1, string str2) { int sign = ; //sign 为符号位 string str; if(str1[] == '-') { sign *= -; str1 = str1.erase(, ); } if(str2[] == '-') { sign *= -; str2 = str2.erase(, ); } int i, j; string::size_type l1, l2; l1 = str1.size(); l2 = str2.size(); for(i = l2 - ; i >= ; i --) { //实现手工乘法 string tempstr; int int1 = , int2 = , int3 = int(str2[i]) - ; if(int3 != ) { for(j = ; j <= (int)(l2 - - i); j++) tempstr = "" + tempstr; for(j = l1 - ; j >= ; j--) { int1 = (int3 * (int(str1[j]) - ) + int2) % ; int2 = (int3 * (int(str1[j]) - ) + int2) / ; tempstr = char(int1 + ) + tempstr; } if(int2 != ) tempstr = char(int2 + ) + tempstr; } str = ADD_INT(str, tempstr); } //去除结果中的前导0 str.erase(, str.find_first_not_of('')); if(str.empty()) str = ""; if((sign == -) && (str[] != '')) str = "-" + str; return str; } //高精度除法 string DIVIDE_INT(string str1, string str2, int flag) { //flag = 1时,返回商; flag = 0时,返回余数 string quotient, residue; //定义商和余数 int sign1 = , sign2 = ; if(str2 == "") { //判断除数是否为0 quotient = "ERROR!"; residue = "ERROR!"; if(flag == ) return quotient; else return residue; } if(str1 == "") { //判断被除数是否为0 quotient = ""; residue = ""; } if(str1[] == '-') { str1 = str1.erase(, ); sign1 *= -; sign2 = -; } if(str2[] == '-') { str2 = str2.erase(, ); sign1 *= -; } int res = compare(str1, str2); if(res < ) { quotient = ""; residue = str1; }else if(res == ) { quotient = ""; residue = ""; }else { string::size_type l1, l2; l1 = str1.size(); l2 = str2.size(); string tempstr; tempstr.append(str1, , l2 - ); //模拟手工除法 for(int i = l2 - ; i < l1; i++) { tempstr = tempstr + str1[i]; for(char ch = ''; ch >= ''; ch --) { //试商 string str; str = str + ch; if(compare(MULTIPLY_INT(str2, str), tempstr) <= ) { quotient = quotient + ch; tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str)); break; } } } residue = tempstr; } //去除结果中的前导0 quotient.erase(, quotient.find_first_not_of('')); if(quotient.empty()) quotient = ""; if((sign1 == -) && (quotient[] != '')) quotient = "-" + quotient; if((sign2 == -) && (residue[] != '')) residue = "-" + residue; if(flag == ) return quotient; else return residue; } //高精度除法,返回商 string DIV_INT(string str1, string str2) { return DIVIDE_INT(str1, str2, ); } //高精度除法,返回余数 string MOD_INT(string str1, string str2) { return DIVIDE_INT(str1, str2, ); } int main() { char ch; string s1, s2, res; while(cin >> ch) { cin >> s1 >> s2; switch(ch) { case '+': res = ADD_INT(s1, s2); break; //高精度加法 case '-': res = MINUS_INT(s1, s2); break; //高精度减法 case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法 case '/': res = DIV_INT(s1, s2); break; //高精度除法,返回商 case 'm': res = MOD_INT(s1, s2); break; //高精度除法,返回余数 default : break; } cout << res << endl; } return(); }
ACM高精度加减乘除模板的更多相关文章
- C++高精度加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- c++的正整数高精度加减乘除
数值计算之高精度加减乘除 一. 高精度正整数的高精度计算 1.加法 2.减法 减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加 3.乘法:用高精度加法实现 l 乘法的主 ...
- ACM赛前准备——模板(排版篇)
ACM赛前准备--模板(排版篇) 更新 前言 效果演示 封面 目录页 模板页(不分栏) 模板页(分栏) 结果文件 快速使用 准备工作 安装TexLive (可选)安装minted包 创建模板 文件结构 ...
- C++高精度整数加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- H. GSS and Simple Math Problem 高精度乘法模板
链接:https://www.nowcoder.com/acm/contest/104/G来源:牛客网 题目描述 Given n positive integers , your task is to ...
- 杭电acm 1002 大数模板(一)
从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...
- 华南理工大学“三七互娱杯”程序设计竞赛(重现赛)( HRY and array 高精度除法模板)
题目链接:https://ac.nowcoder.com/acm/contest/874/D 题目大意:给你两个数列a和b然后对a可以进行排列,对b可以任意排列,问你sigma(a(i)*b(i))的 ...
- Hdu 4762 网络赛 高精度大数模板+概率
注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放, ...
- 【高精度】模板 (C++)
//n为长度 1.高精加 复杂度:O(n) #include<iostream> #include<cstring> #include<algorithm> usi ...
随机推荐
- $timeout, $interval
$timeout, $interval layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...
- 记录一次webbrowser无法加载 activex 遇到的问题
关联配置: win7 x64 Adobe Reader XI activex 安装目录X84 笔者项目运行Any CPU 无论如何也加载不出PDF 刚开始还以为自己封装的控件XWebBrowser的问 ...
- Java学习之抽象类的总结
抽象类的特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中,该类必须也被abstract修饰.2,抽象类不可以被实例化.为什么?因为调用抽象方 ...
- 【转载】python 模块 - random生成随机数模块
随机数种子 要每次产生随机数相同就要设置种子,相同种子数的Random对象,相同次数生成的随机数字是完全相同的: random.seed(1) 这样random.randint(0,6, (4,5)) ...
- google浏览器的安装
很简单,命令行下安装命令:apt-get install google-chrome-stable(如安装不成功,输入apt-get -f install进行修复依赖,之后在菜单里就可以看到图标了) ...
- 【转】IOS 输入框被键盘遮盖的解决方法
做IOS开发时,难免会遇到输入框被键盘遮掩的问题.上网上搜索了很多相关的解决方案,看了很多,但是由衷的觉得太麻烦了. 有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollVi ...
- 从51跳新唐cortex-m0学习1——思想转变
Cortex-M0学习第一帖 序言:这里先说一下,大家在看帖子时候,可能看见字数比较多的,可能只是先大概浏览一下,之后从中挑几段大概瞅瞅,但是我要说,如果你碰到一个适合的帖子,请仔细品读,这是我在论坛 ...
- 技术不牛如何才拿到国内IT巨头的Offer
不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...
- 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
用三种方法实现对一个数组的排序,并设计一个函数实现数的查找,要求时间越短越好,空间占用越少越好. 对数组排序的方法很多,我们选比较常用和容易的三种排序,直接插入排序,冒泡排序和快速排序. 直接插入排序 ...
- Android 实现简单天气应用
引导页面,多个城市的天气,可以通过滑动来翻阅. 先看下截图: 1.城市天气界面 2.引导界面 应用引导页面 package org.qxj.iweather.page; import org.qxj. ...