专题 高精度算法
时间:2019-04-19
本文章向大家介绍专题 高精度算法,主要包括专题 高精度算法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
算法简介
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字在C++中正常存储, 看看人家Java和python ,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
这里,我们给出相对较快的压位的高精度模板。因为理解起来十分容易,这里不做过多的说明。
同时,网上两位不知名的大佬的模板给了我很大的帮助:
https://www.cnblogs.com/hnqw1214/p/6351321.html
https://www.cnblogs.com/candy99/p/gaojingdu.html
【代码】
#include <bits/stdc++.h>
using namespace std;
const int Mod=10000;
const int power=4;
char str1[10010],str2[10010];
struct Big
{
int a[50000],n;
int& operator [](int x) {return a[x];}
Big():n(1) {memset(a,0,sizeof(a));}
Big(char *str)
{
int len=strlen(str),w,t=0;
reverse(str,str+len);
n=(len+power-1)/power;
for(int i=0;i<len;++i)
{
if(i%power==0) {w=1; ++t;}
a[t]+=w*(str[i]-'0');
w*=10;
}
}
void init(int x) {a[1]=x; n=1;}
};
bool operator <(Big a,Big b) //小于
{
if(a.n==a.n)
{
for(int i=a.n;i>=1;i--)
{
if(a[i]==b[i]) continue;
else return a[i]<b[i];
}
}
else return a.n<b.n;
}
Big operator +(Big a,Big b) //加法
{
int g=0,n=max(a.n,b.n);
for(int i=1;i<=n;++i)
{
g+=(i<=a.n?a[i]:0);
g+=(i<=b.n?b[i]:0);
a[i]=g%Mod; g/=Mod;
}
a.n=n;
if(g) a[++a.n]=g;
return a;
}
Big operator -(Big a,Big b) //减法
{
bool flag=0;
if(a<b) {flag=1; swap(a,b);} //如果a<b,减法运算之后就是负数,所以交换后会很方便
for(int i=1;i<=b.n;i++)
{
if(a[i]<b[i]) {a[i]+=Mod; a[i+1]--;}
a[i]-=b[i];
}
while(a[a.n]==0&&a.n) a.n--;
if(flag) a[a.n]=-a[a.n];
return a;
}
Big operator *(Big a,Big b) //乘法
{
Big c;
for(int i=1;i<=a.n;++i)
{
int g=0;
for(int j=1;j<=b.n;++j)
{
g+=c[i+j-1]+a[i]*b[j];
c[i+j-1]=g%Mod; g/=Mod;
}
c[i+b.n]=g;
}
c.n=a.n+b.n;
while(c.n&&c[c.n]==0) c.n--;
return c;
}
void Print(Big a) //输出
{
printf("%d",a[a.n]);
for(int i=a.n-1;i>=1;i--)
printf("%04d",a[i]);
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
scanf("%s%s",str1,str2);
Big a=Big(str1),b=Big(str2);
Print(a+b); putchar('\n');
Print(a-b); putchar('\n');
Print(a*b); putchar('\n');
return 0;
}
- 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 数组属性和方法
- 2017年天梯赛大区赛题集 7-1 出生年
- 2017年天梯赛大区赛题集 7-9 人以群分
- 浙大版《C语言程序设计(第3版)》题目集 练习2-1 Programming in C is fun!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-3 输出倒三角图案
- 这款网络排查工具,堪称神器!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-4 温度转换
- 浙大版《C语言程序设计(第3版)》题目集 练习2-6 计算物体自由下落的距离
- 浙大版《C语言程序设计(第3版)》题目集 练习2-8 计算摄氏温度
- 浙大版《C语言程序设计(第3版)》题目集 练习2-9 整数四则运算
- 浙大版《C语言程序设计(第3版)》题目集 练习2-10 计算分段函数[1]
- 浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2]
- SAP Spartacus产品页面的normalizer
- Nodejs中使用net-snmp库读取智慧站房的温湿度、空调等实时数据
- 生气!面试官你过来,我给你手写一个Spring Aop实现!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表