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\) 为最佳. 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: 数据范围 算法选择 ...
随机推荐
- mina 实例(转载)
mina:http://mina.apache.org/ 原文:http://maosheng.iteye.com/blog/1891665 大并发量socket 通信框架MINA介绍 博客分类: J ...
- 深度优先搜索——迷宫问题(华为oj)
题目描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...
- leetcode add two numbers python
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...
- <正向/反向>最大匹配算法(Java)
算法描述(正向): 给定最大词长n,待分词文本str,指针f=0,词典dic文档 1 取子串sub=str(f,f+n) 2 如果(遍历dic,有匹配sub) f++; 3 否则 n--; 4 注意: ...
- 非原生APP开发中可以用到的JQ插件
fancybox 弹出层 图片什么的都可以 效果还不错..
- 【算法】计算一篇文章的单词数(C、Java语言实现)
1. C语言:一个字符一个字符的读取 (有空再贴出来) 2.Java语言:按行读取,并用正则分割成多个单词,再用MapReduce并行计算单词数 (我使用的是ieda,有些地方跟eclipse有点区别 ...
- ruiy_ocfs2
http://docs.oracle.com/cd/E37670_01/E37355/html/ol_instcfg_ocfs2.html
- start stack
Start OpenStack Services After launching your stack by Devstack, you maybe stop some services or reb ...
- 阻止长按复制页面中的内容;zepto中touch中的应用必须先加载event模块之后;
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SQL基础查询实战
总结: 一.单表查询的情况: 1.where.....group by .. Having count(..) 2.Group by haing min(..)条件and max(..)条件(查询最低 ...