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\) 为最佳. 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: 数据范围 算法选择 ...
随机推荐
- LayoutInflater作用及使用
作用: 1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方法 ...
- win7(32 bit) 环境下点击打印预览报错解决办法
如题,报错截图如下 : 解决办法如下: 1.关闭系统数据执行保护.具体操作: 在win7 系统命令行中执行如下命令: bcdedit.exe /set {current} nx Alw ...
- [C#参考]UI和线程(一)
Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程. 什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包 ...
- AXIS2远程调用WebService示例(Eclipse+AXIS)
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/10/3071584.html 我们将Web Service发布在Tomcat或者其他应 ...
- 插入数据,返回最新id
最简单的方法就是在查询之后select @@indentity. sql代码: INSERT INTO table_name (.....) VALUES(......) SELECT @@IDEN ...
- hdu 3572 Escape 网络流
题目链接 给一个n*m的图, 里面有一些点, '.'代表空地, '#'代表墙, 不可以走, '@'代表大门, 可以有多个, 'X'代表人, 问所有人都走出大门需要的最短时间, 每一时刻一个格子只能有一 ...
- android-SQLite 和 Content
SQLite 游标(Cursor)相当于指向底层数据中结果集的指针,而不是提取和返回结果值的副本,是在结果集中对位置(行)进行控制的管理方式. moveToFirst:把游标移动到查询结果的第一行 m ...
- SQL 设计心得、逗号分隔列表
第一: 在开始编码前.主要关注数据库里要保存什么样的数据,以级最佳的数据组织方式和内在关联方式. 第二: 使用你所知的数据库特性尽可能高效的实现数据管理.如正确的索引.数据库类型.高效的select! ...
- Html 小插件5 百度搜索代码2
网页添加百度搜索框代码大全 ★ 用法:在下面选择合适的样式,复制代码到网页中相应位置粘贴即可. ★ 样式一(200×30)代码: <iframe id="baiduframe" ...
- nginx filter
server { listen 80; server_name g.zcdn.com; index index.html; location / { proxy_cache cache_go; pro ...