目录
高精度是什么?
额……
不知道你们有没有遇上这种坑题
说明/提示
每个数字不超过
明显,开__int128也不够,还可能会遇上残忍的
好了,此题无解
真的吗???
说明/提示
每个数字不超过 ………………,需用高精度
那话说回来,高精度又是啥呢
百度百科
高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中, 用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
代码
接下来看一下思路
首先呢我们选择用string做(网上都是数组,但string输入输出简单,开的也可以更大,还有很多辅助功能(可以多定义一些),我觉得更好一些)
再来看一看加法
加法
这个直接看竖式
12345678
+ 22345678
1111 (进位)
————————
34691356
进位也不难
但你在看下面的代码上时
会发现特别长
为什么
因为
负数!!!
男不男???
当然,复制下方代码准没错
减法
这边呢
有个退位
还有减数太大的问题
所以有一些特判
当然没啥大的问题
看竖式
. . . . (退位位)
12345
- 7777
——————
4568
好了,你学fei了吗?
重大事件
- 调了一个下午,把int*调为string,然后……加减法好难(这不就相当于没做吗???)
- 到了晚上,终于调好了
- 又调了一个上午,增加了负数的加减法
代码来咯!
#include<bits/stdc++.h>
using namespace std;
namespace high_pre{
typedef string high_pre_num;
high_pre_num input(){//输入
high_pre_num a="";
cin>>a;
reverse(a.begin(),a.end());
return a;
}
high_pre_num init(string x){//定义(等于a=……)
high_pre_num a="";
reverse(x.begin(),x.end());
a=x;
return a;
}
void output(high_pre_num a){//输出
reverse(a.begin(),a.end());
bool s=0,k=0;
for(int i=0;i<a.size();i++){
if(a[i]=='-')
k=1;
else if(a[i]>'0'){
if(k){
putchar('-');
k=0;
}
s=1;
}
if(s)
putchar(a[i]);
}
if(!s){
putchar('0');
}
}
bool greater(high_pre_num a,high_pre_num b){//大于
if(a[a.size()-1]!='-'&&b[b.size()-1]!='-'){
if(a.size()>b.size())
return true;
if(a.size()<b.size())
return false;
else{
for(int i=0;i<a.size();i++)
if(a[i]>b[i]) return true;
return false;
}
}
else if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
if(a.size()>b.size())
return true;
if(a.size()<b.size())
return false;
else{
for(int i=1;i<a.size();i++){
if(a[i]>b[i]) return true;
if(a[i]<b[i]) return false;
}
return false;
}
}
else if(a[a.size()-1]=='-'&&b[b.size()-1]!='-')
return false;
else
return true;
}
bool less(high_pre_num a,high_pre_num b){//小于
return greater(b,a);
}
bool equals(high_pre_num a,high_pre_num b){//等于
if(greater(a,b))
return false;
else if(less(a,b))
return false;
return true;
}
high_pre_num minus(high_pre_num a){//等于平时我们用的-a(a为一个变量)
if(a[a.size()-1]=='-')
a.pop_back();
else
a+='-';
return a;
}
high_pre_num add(high_pre_num a,high_pre_num b){//加法
high_pre_num s="";
if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){
a.pop_back();
swap(a,b);
bool k=0;
if(less(a,b))
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){
b.pop_back();
bool k=0;
if(less(a,b))
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
bool k=0;
if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){
b.pop_back();
a.pop_back();
k=1;
}
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<=lll;i++){
b+='0';
a+='0';
l=a[i]-'0'+b[i]-'0'+x;
if(l==0&&i==lll)<%
break;
%>
x=0;
if(l>=10){
x+=l/10;
l%=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)
s+='-';
return s;
}
high_pre_num sub(high_pre_num a,high_pre_num b){//减法
if(a[a.size()-1]=='-'&&b[b.size()-1]!='-'){//被减数是负数时
a.pop_back();
return add(a,b)+'-';
}
if(a[a.size()-1]!='-'&&b[b.size()-1]=='-'){//减数是负数时
b.pop_back();
return add(a,b);
}
bool nnn=0;
if(a[a.size()-1]=='-'&&b[b.size()-1]=='-'){//两个都是负数时
b.pop_back();
a.pop_back();
nnn=1;
}
bool k=0;
if(less(a,b))//是负数
swap(a,b),k=1;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<lll;i++){
b+='0';
a+='0';
l=a[i]-'0'-b[i]+'0'-x;
x=0;
if(l<0){
x++;
l+=10;
}
char xx=(l+'0');
s+=xx;
}
if(k)//特判
s+='-';
if(nnn)//特判
s=minus(s);
return s;
}
int hpntoi(high_pre_num a){//转化为int(有个前提,不爆int)
reverse(a.begin(),a.end());
return stoi(a);
}
long long hpntoll(high_pre_num a){//转化为long long(有个前提,不爆long long)
reverse(a.begin(),a.end());
return stoll(a);
}
long hpntol(high_pre_num a){//转化为long(有个前提,不爆long)
reverse(a.begin(),a.end());
return stol(a);
}
/*
high_pre_num mult(high_pre_num a,high_pre_num b){//没调好的乘法
bool k=0;
high_pre_num s="";
int x=0,l=0;
int lll=max(a.size(),b.size());
for(int i=0;i<=lll;i++){
b+='0';
a+='0';
l=(a[i]-'0')*(b[i]-'0')+x;
x=0;
if(l>9){
x+=l/10;
l%=10;
}
char xx=(l+'0');
s+=xx;
}
return s;
}
*/
}
麻烦给个赞(你也可以不给),我是个小学生(不骗你!四年级,看我简介)