数值计算之高精度加减乘除

一.      高精度正整数的高精度计算

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++的正整数高精度加减乘除的更多相关文章

  1. ACM高精度加减乘除模板

    [转]#include <iostream> #include <string> using namespace std; inline int compare(string ...

  2. BZOJ 1225: [HNOI2001] 求正整数 高精度+搜索+质数

    题意:给定n求,有n个因子的最小正整数. 题解:水题,zcr都会,我就不说什么了. 因数个数球求法应该知道,将m分解质因数,然后发现 a1^p1*a2^p2....an^pn这样一个式子, (1+p1 ...

  3. 大数高精度加减乘除 51nod 1005 大数加法

    1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...

  4. C++高精度加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的. 其中高精度除法返回一对string,分别表示商和余数. 代码: #include <bits/stdc++.h> ...

  5. c++ 高精度 加减乘除 四则运算 代码实现

    很久以前写的啦 记得写了好久好久一直卡在特例的数据上面 想起都心塞 那时候变量和数组的取名对我来说简直是个大难题啊 完全乱来 abcdef就一路排下来 自己看的时候都搞不懂分别代表什么 好在后来英语学 ...

  6. 高精度&&FFT

    ACM-高精度模板(综合篇) 时间:-- :: 阅读: 评论: 收藏: [点我收藏+] 标签:高精度 在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式 ...

  7. NOIP的模板--考前复习

    距离NOIP还有25天 可以去放弃一些巨难得题目去搞一些模板了 -------在校老师的原话 一·快排 虽然可以手打,最好用STL,里面有很多优化,会快很多 #include<iostream& ...

  8. <知识整理>2019清北学堂提高储备D4

    今天主要讲一下数学的知识. 一.进制转换: 十进制到k进制:短除法:顺除至0,逆序取余. k进制转十进制:乘权相加. 常见进制:四进制(对应2位二进制).八进制(对应3位二进制).十六进制(对应4位二 ...

  9. ACM-由数据范围反推算法复杂度以及算法内容

    一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 \(10^7\) 为最佳. 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: 数据范围 算法选择 ...

随机推荐

  1. hadoop 配置文件注意问题

    一定要配置成hostname形式: 如伪分布:配成localhost:9000 完全分布:配成big1:9000

  2. liunx操作数据库

    liunx操作数据库 1.连接数据库 #mysql -uroot -p mysql -uroot -p 然后输入密码 2.关闭防火墙 #iptables -stop 开启#iptables -star ...

  3. 非原生APP开发中可以用到的JQ插件

    fancybox 弹出层 图片什么的都可以 效果还不错..

  4. Android Studio 中快速提取方法

    在开发过程中,有时在一个方法内部写了过多的代码,然后想要把一些代码提取出来封装下,分离开放在一个单独的方法里,可能你的做法是直接选中后Ctrl + 叉,或者 Ctrl + C,但在Android St ...

  5. js导出成excel

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 黑马程序员_<<StringBuffer,包装类>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1. StringBuffer 1.概述 S ...

  7. 第七届河南省赛H.Rectangles(lis)

    10396: H.Rectangles Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 229  Solved: 33 [Submit][Status] ...

  8. oracle decode函数用法

    DECODE函数是ORACLE PL/SQL是功能强大的函数之中的一个,眼下还仅仅有ORACLE公司的SQL提供了此函数,其它数据库厂商的SQL实现还没有此功能.DECODE有什么用途 呢? 先构造一 ...

  9. 访问权限系列一(public/private/protected/default):成员变量

    通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...

  10. Problem A: 走迷宫问题

    Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...