高精从入门到入土
时间:2019-10-08
本文章向大家介绍高精从入门到入土,主要包括高精从入门到入土使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
跑得超快的压位高精
#include<bits/stdc++.h>
using namespace std;
#define power 4//每次运算的位数为10的power次方,在这里定义为了方便程序实现
#define base 10000//10的power次方。//要压位的时候,只需改power 和 base即可,如压万位高精,那么power = 4, base = 10000
#define N 1001 //数组的长度。
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define dwn(i,a,b) for(int i=a;i>=b;--i)
char a[N], b[N];
struct num
{
int a[N];
num(){memset(a,0,sizeof(a));}
int& operator [](int x){return a[x];}
num(char *s) //将一个字符串初始化为高精度数
{
memset(a,0,sizeof(a));
int len=strlen(s);
a[0]=(len+power-1)/power;//数的长度
for(int i=0,t=0,w;i<len;w*=10,++i)
{
if(i%power==0){w=1,++t;}
a[t]+=w*(s[i]-'0');
}
}
void add(int k){if(k || a[0])a[++a[0]]=k;} //在末尾添加一个数,除法的时候要用到
void re(){reverse(a+1, a+a[0]+1);} //把数反过来,除法的时候要用到
void print()
{
printf("%d", a[a[0]]);
for(int i=a[0]-1;i>0;--i)
printf("%0*d",power,a[i]); //这里"%0*d", power的意思是,必须输出power位,不够则前面用0补足
printf("\n");
}
}p,q,ans;
bool operator < (num &p,num &q)//判断小于关系,除法的时候有用
{
if(p[0]<q[0])return 1;
if(p[0]>p[0])return 0;
for(int i=p[0];i>0;--i)
if(p[i]!=q[i])
return p[i]<q[i];
return false;
}
num operator +(num &p,num &q)
{
num c;
c[0]=max(p[0],q[0]);
rep(i,1,c[0])
{
c[i]+=p[i]+q[i];
c[i+1]=c[i]/base;
c[i]%=base;
}
while(c[c[0]+1])++c[0];
return c;
}
num operator -(num &p,num &q)
{
num c=p;
rep(i,1,c[0])
{
c[i]-=q[i];
if(c[i]<0)
{
c[i]+=base;
--c[i+1];
}
}
while(c[0] && !c[c[0]])--c[0];
return c;
}
num operator *(num &p,num &q)
{
num c;
c[0]=p[0]+q[0]-1;
rep(i,1,p[0])
rep(j,1,q[0])
{
c[i+j-1]+=p[i]*q[j];
c[i+j]+=c[i+j-1]/base;
c[i+j-1]%=base;
}
if(c[c[0]+1])++c[0];
return c;
}
num operator /(num &p,num &q)
{
num x,y;
dwn(i,p[0],1)//从最高位开始取数
{
y.add(p[i]); //把数添到末尾(最低位),这时候是高位在前,低位在后
y.re(); //把数反过来,变为统一的存储方式:低位在前,高位在后
while(!(y<q)) //大于等于除数的时候,如果小于的话,其实答案上的该位就是初始的“0”
y=y-q,++x[i]; //看能减几个除数,减几次,答案上该位就加几次。
y.re(); //将数反过来,为下一次添数做准备
}
x[0]=p[0];
while(x[0] && !x[x[0]])--x[0];
return x;
}
int main()
{
freopen("A.txt","r",stdin);
scanf("%s",a);
scanf("%s",b);
reverse(a,a+strlen(a));
reverse(b,b+strlen(b));
p=num(a),q=num(b);
ans=p+q;
ans.print();
ans=p-q;
ans.print();
ans=p*q;
ans.print();
ans=p/q;
ans.print();
return 0;
}
原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11634719.html
- 网站静态内容出版解决方案
- 如何复制图文消息封面图片?正文没显示
- C#基础知识回顾--线程传参
- 数据库进程间通信解决方案IPC
- 苹果后端的Oracle数据库
- C#基础知识回顾--C#遍历enum类型、获取enum项个数
- 用香蕉也能玩电脑游戏—Tensorflow对象检测接口的简单应用
- 通过图片定位给一张图片添加多个链接
- Struts Interceptor Example
- 微信服务号模板消息接口新增"设置行业"和"添加模板"及细节优化
- WPF备忘录(3)如何从 Datagrid 中获得单元格的内容与 使用值转换器进行绑定数据的转换IValueConverter
- WPF备忘录(2)WPF获取和设置鼠标位置与progressbar的使用方法
- WPF文字修饰——上、中、下划线与基线
- 微信公众平台数据接口正式对所有认证公众号开放
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux 安装并配置zsh
- 听音乐不过瘾?自制一个音乐播放器!【附带函数源码】
- Python 技术篇-3行代码实现Gif动画生成,Gif动画素材获取方法
- Linux 文件隐藏权限
- 还在用print()查找错误?日志消息这顿排骨它不香嘛?
- CNS图表复现02—Seurat标准流程之聚类分群
- Python 技术篇-莉莉机器人api调用方法,实例演示。免费的机器人
- Hugo Travis 完结!
- 【Python】秀儿!两行代码制作你的专属动态二维码
- Windows 技术篇-网卡物理(MAC)地址查看方法
- Go使用工厂方法实例结构体
- Java交互界面实现计算器开发设计【附函数源码】
- Python 技术篇-读取本地文件的字节数
- Golang Flag包的参数格式问题
- Python 技术篇-对音频、图片等文件进行base64编码和解码