高精度

高精度,即高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。

重载运算符

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

今以高精度 a−ba-ba−b 为例,展示在struct中重载运算符的方法。

#include<cstdio>
#include<cstdlib>
#include<cstring> #define reg register const int MAXN=10010; struct node{
bool f; //是否为负
char a[MAXN+10];
node(){ //对结构体进行初始化
f=0;
memset(a,0,sizeof(a));
}
void read(){ //读入一个非负的node数
char s[MAXN+10];
scanf("%s",s+1);
int l=strlen(s+1);
for(reg int i=1;i<=l;++i)
a[i]=s[l-i+1]-'0';
}
void print(){ //打印一个node数
bool tf=0; //是否没有前缀0
if(f) printf("-");
for(reg int i=MAXN;i>=1;--i){
if(a[i]) tf=1;
if(tf) printf("%d",a[i]);
}
if(!tf) printf("0");
}
node&operator+(node&b){ //重载加法+
/*
在这个函数中,operator表示重载,b是+号右边的加数,
this是一个指向自己的node类型的指针,返回用*this
*/
for(reg int i=1;i<=MAXN;++i){
a[i]+=b.a[i];
if(a[i]>9){
a[i]-=10;
++a[i+1];
}
}
return*this;
}
//对于a-b,若b>a,则a-b=-(b-a)。
bool operator>(node&b){
for(reg int i=MAXN;i>=1;--i)
if(a[i]!=b.a[i])
return bool(a[i]>b.a[i]);
return 0;
}
node&operator-(node&b){
if(b>*this){
node t=*this;*this=b;b=t;
f=1;
}
for(reg int i=MAXN;i>=1;--i)
a[i]-=b.a[i];
for(reg int i=1;i<=MAXN;++i)
if(a[i]<0){
a[i]+=10;
--a[i+1];
}
return*this;
}
//省事
node&operator+=(node&e){
return*this+e;
}
node&operator-=(node&e){
return*this-e;
}
}a,b; int main(){
a.read();b.read();a-=b;
a.print();
}

题目描述 luoguP1601\text{luoguP1601}luoguP1601

高精度加法,相当于 a+ba+ba+b Problem,不用考虑负数。

输入格式

分两行输入 a,b≤10500a,b\leq10^{500}a,b≤10500

输出格式

输出只有一行,代表 a+ba+ba+b 的值

输入样例

1
1

输出样例

2

Solution 1601\text{Solution 1601}Solution 1601

考虑用数组 A,BA,BA,B 存储大数 a,ba,ba,b 进行计算。为了实现方便,常使用 struct 结构体存储。代码见文首。

题目描述 luoguP2142\text{luoguP2142}luoguP2142

高精度减法

输入格式

两个整数 a,ba,ba,b

输出格式:

结果

输入样例

2
1

输出样例

1

数据规模与约定

对于 100100%100 的数据,有 0&lt;a,b≤1010 0000&lt;a,b\leq10^{10\ 000}0<a,b≤1010 000

Solution 2142\text{Solution 2142}Solution 2142

注意判负即可。计算 a−b (a,b≥0)a-b\ (a,b\geq0)a−b (a,b≥0) 时,若 b&gt;ab&gt;ab>a,则 a−b=−(b−a)a-b=-(b-a)a−b=−(b−a)。

代码见文首。

练习

  1. 高精度除法luoguP1480\text{luoguP1480}luoguP1480
  2. 高精度开根luoguP2293\text{luoguP2293}luoguP2293

高精度运算略解 在struct中重载运算符的更多相关文章

  1. 【C++】C++中重载运算符和类型转换

    输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...

  2. c++中重载运算符

    重载运算符 1,成员函数运算符 运算符重载为类的成员函数一般格式如下 <函数类型> operator <运算符> (参数表) {函数体} 调用成员函数运算符如下 <对象名 ...

  3. Opencv中Mat矩阵相乘——点乘、dot、mul运算详解

    Opencv中Mat矩阵相乘——点乘.dot.mul运算详解 2016年09月02日 00:00:36 -牧野- 阅读数:59593 标签: Opencv矩阵相乘点乘dotmul 更多 个人分类: O ...

  4. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  5. C++中重载函数详解

    函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避 ...

  6. C++ Primer : 第十四章 : 重载运算与类型转换之重载运算符

    重载前须知 重载运算符是特殊的函数,它们的名字由operator和其后要重载的运算符号共同组成. 因为重载运算符时函数, 因此它包含返回值.参数列表和函数体. 对于重载运算符是成员函数时, 它的第一个 ...

  7. 【CTF 攻略】CTF比赛中关于zip的总结

    [CTF 攻略]CTF比赛中关于zip的总结   分享到: --> 本文首发于安全客,建议到原地址阅读,地址:http://bobao.360.cn/ctf/detail/203.html 前言 ...

  8. 详解Python编程中基本的数学计算使用

    详解Python编程中基本的数学计算使用 在Python中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯 ...

  9. c++中有些重载运算符为什么要返回引用

    事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...

随机推荐

  1. 4、链栈的实现(java代码)

    1.链节点 public class Node<T> { public T data; public Node next; } 2.实现代码 public class Stack<T ...

  2. WeakMap 本身释放,而 keyObject 没有释放的情况下,value 会释放吗?

    const keyObject = ['keyObject']; new WeakMap().set(keyObject, ['value']); 问题:现在 ['value'] 会被释放吗? 听说W ...

  3. ADC0832

    #include <reg51.h> #include "ADC0832.c" code uchar seven_seg[]={0xc0, 0xf9, 0xa4, 0x ...

  4. 表达式树练习实践:C#值类型、引用类型、泛型、集合、调用函数

    目录 表达式树练习实践:C#值类型.引用类型.泛型.集合.调用函数 一,定义变量 二,访问变量/类型的属性字段和方法 1. 访问属性 2. 调用函数 三,实例化引用类型 四,实例化泛型类型于调用 五, ...

  5. Linux 修改 ls 时间显示格式

    [root@CentosTe tmp]# export TIME_STYLE='+%Y-%m-%d %H:%M:%S'[root@CentosTe tmp]# ll总计 24-rwx------ 1  ...

  6. 使用回车键执行input框事件

    html: <input type="text" class="search-data-input" placeholder="请输入关键词&q ...

  7. Redis连接池-Java代码

    1.JedisUtil类 2.测试类 3.测试日志(模拟出现竞争情况) import org.apache.log4j.Logger; import redis.clients.jedis.Jedis ...

  8. Spring Cloud Config 配置中心实践过程中,你需要了解这些细节!

    本文导读: Spring Cloud Config 基本概念 Spring Cloud Config 客户端加载流程 Spring Cloud Config 基于消息总线配置 Spring Cloud ...

  9. ELK系列(二):.net core中使用ELK

    ELK安装好后,我们现在.net Core中使用一下,大体思路就是结合NLog日志组件将数据写入ELK中,其它语言同理. ELK的安装还是有些复杂的,我们也可以在Docker中安装ELK:docker ...

  10. Java 基础篇之反射

    反射 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使 ...