c++的正整数高精度加减乘除
数值计算之高精度加减乘除
一. 高精度正整数的高精度计算
1.加法
2.减法
减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加
3.乘法:用高精度加法实现
l 乘法的主要思想是把乘法转化为加法进行运算。请先看下面的等式:
12345*4=12345+12345+12345+12345
12345*20=123450*2
12345*24=12345*20+12345*4
l 等式(1)说明,多位数乘一位数,可以直接使用加法完成。
l 等式(2)说明,多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。
l 等式(3)说明,多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。
l 因此,多位数乘多位数最终可以全部用加法来实现。
4.除法:用高精度减法实现
二. 注意清零和对位操作
三. 代码
- //
- // main.cpp
- // 正整数高精度运算
- //
- // Created by ashley on 14-11-9.
- // Copyright (c) 2014年 ashley. All rights reserved.
- //
- #include <iostream>
- #include <string>
- using namespace std;
- string clearZeros(string data)
- {
- if (data[] == '') {
- int key = (int) data.length() - ;
- for (int i = ; i < data.length(); i++) {
- if (data[i] != '') {
- key = i;
- break;
- }
- }
- data.erase(, key);
- }
- if (data == "") {
- data = "";
- }
- return data;
- }
- //对位操作
- void countPoint(string &operand1, string &operand2)
- {
- while (operand1.length() < operand2.length()) {
- operand1 = "" + operand1;
- }
- while (operand1.length() > operand2.length()) {
- operand2 = "" + operand2;
- }
- }
- //判断大小
- bool bigger(string operand1, string operand2)
- {
- return operand1 >= operand2;
- }
- string addition(string addent, string adder)
- {
- //先对位,在加数和被加数前面适当补0,使他们包含相同的位数
- countPoint(addent, adder);
- //前面再补一个0,确定和的最多位数
- addent = "" + addent;
- adder = "" + adder;
- //从低位开始,对应位相加,结果写进被加数中,如果有进位,直接给被加数前一位加1
- for (int i = (int) addent.length() - ; i > ; i--) {
- addent[i] = addent[i] + adder[i] - ;
- if (addent[i] > '') {
- addent[i] = addent[i] - ;
- addent[i - ] = addent[i - ] + ;
- }
- }
- return clearZeros(addent);
- }
- string subtraction(string subtrahend, string subtractor)
- {
- //先对位,在减数和被减数前面适当补0,使他们包含相同的位数
- countPoint(subtrahend, subtractor);
- //判断被减数和减数谁大,保证被减数大于减数
- if (bigger(subtrahend, subtractor)) {
- subtrahend[] = subtrahend[] - subtractor[] + ;
- for (int i = ; i < (int)subtrahend.length(); i++) {
- if (subtrahend[i] >= subtractor[i]) {
- subtrahend[i] = subtrahend[i] - subtractor[i] + ;
- } else {
- subtrahend[i] = subtrahend[i] - subtractor[i] + + ;
- subtrahend[i - ]--;
- }
- }
- } else {
- subtrahend = '-' + subtraction(subtractor, subtrahend);
- }
- return subtrahend;
- }
- string multiplication(string multiplicand, string multiplier)
- {
- string result = "";
- for (int i = (int)multiplier.length() - ; i >= ; i--) {
- for (char c = ''; c <= multiplier[i]; c++) {
- result = addition(result, multiplicand);
- }
- multiplicand = multiplicand + "";
- }
- return clearZeros(result);
- }
- // 试商法
- string division(string dividend, string divisor)
- {
- // 存放商
- string result;
- // 存放余数
- string remains;
- for (int i = ; i < (int)dividend.length(); i++) {
- remains = remains + dividend[i];
- result = result + "";
- // 从1往上试
- while (bigger(remains, result)) {
- cout << result << "-----------" << remains << endl;
- result[result.length() - ]++;
- remains = subtraction(remains, divisor);
- }
- }
- return clearZeros(result);
- }
- int main(int argc, const char * argv[])
- {
- string a, b;
- int tests;
- cin >> tests;
- while (tests--) {
- cin >> a >> b;
- //正整数高精度加法,从低位开始
- //cout << addition(a, b) << endl;
- //正整数高精度减法,从高位开始
- //cout << subtraction(a, b) << endl;
- //正整数高精度乘法,将乘法转换为加法进行运算
- //cout << multiplication(a, b) << endl;
- cout << division(a, b) << endl;
- //正整数高精度除法
- }
- return ;
- }
c++的正整数高精度加减乘除的更多相关文章
- ACM高精度加减乘除模板
[转]#include <iostream> #include <string> using namespace std; inline int compare(string ...
- BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数
题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...
- 大数高精度加减乘除 51nod 1005 大数加法
1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...
- C++高精度加减乘除模板
其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...
- c++ 高精度 加减乘除 四则运算 代码实现
很久以前写的啦 记得写了好久好久一直卡在特例的数据上面 想起都心塞 那时候变量和数组的取名对我来说简直是个大难题啊 完全乱来 abcdef就一路排下来 自己看的时候都搞不懂分别代表什么 好在后来英语学 ...
- 高精度&&FFT
ACM-高精度模板(综合篇) 时间:-- :: 阅读: 评论: 收藏: [点我收藏+] 标签:高精度 在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式 ...
- NOIP的模板--考前复习
距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...
- <知识整理>2019清北学堂提高储备D4
今天主要讲一下数学的知识. 一.进制转换: 十进制到k进制:短除法:顺除至0,逆序取余. k进制转十进制:乘权相加. 常见进制:四进制(对应2位二进制).八进制(对应3位二进制).十六进制(对应4位二 ...
- ACM-由数据范围反推算法复杂度以及算法内容
一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 \(10^7\) 为最佳. 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: 数据范围 算法选择 ...
随机推荐
- sql 练习(3)
1.打印九九乘法表 ) ,exp)) A, ,exp))B, ,exp))C, ,exp))D, ,exp))E, ,exp))F, ,exp))G, ,exp))H, ,exp))I from ( ...
- c# Linq及Lamda表达式应用经验之 GroupBy 分组
示例1: GroupBy 分组在List<>泛型中的应用 原表: 按姓名Nam 分组后结果: 对DATATABLE 进行LAMDA查询时必须在项目的引用中添加 System.Data.Da ...
- [vc]如何对radio按钮分组
如何使用多组? 多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了.再为对话框添加Radio3和Radio4.很简单,先为这些RadioButton排个顺序,就是排列他们的TABORDER.在对话 ...
- c#实现pdf另存为功能
c#实现pdf另存为功能 /// <summary> /// PDF另存为效果 /// </summary> /// <param name="fileName ...
- centos 安装mysql密码修改后还是不能连接的原因
centos 上安装mysql密码修改后还是不能连接出现错误:ERROR 1142 (42000): SELECT command denied to user ''@'localhost' for ...
- Mac 10.7.*安装XCode3.2.6的方法
1.首先,在Xcode 3.2.6的磁盘映像(dmg文件)上点击右键,选择“磁盘工具”打开,如图1所示,转换成一个可读写的dmg文件,如图2所示. 图1 图2 转换好后双击它,让它在Finder里面显 ...
- R与数据分析旧笔记(十五) 基于有代表性的点的技术:K中心聚类法
基于有代表性的点的技术:K中心聚类法 基于有代表性的点的技术:K中心聚类法 算法步骤 随机选择k个点作为"中心点" 计算剩余的点到这个k中心点的距离,每个点被分配到最近的中心点组成 ...
- FTL(Flash translation layer)闪存转换层
前面说过,闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操 ...
- HelloX项目github协同开发指南
概述 为了提高协同开发效率,HelloX项目已托管到github网站上.根据目前的开发进展,创建了下列几个子项目: HelloX操作系统内核项目:https://github.com/hellox-p ...
- iOS 首次启动画面,新装或更新用户可以通过它查看简介。
// // GuideViewController.h // Guide // // Created by twb on 13-9-17. // Copyright (c) 2013年 twb. Al ...