专栏文章
高精度头文件
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mir1sl2d
- 此快照首次捕获于
- 2025/12/04 14:21 3 个月前
- 此快照最后确认于
- 2025/12/04 14:21 3 个月前
CPP
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
#define ps __gnu_pbds
#define tree ps::tree<pair<int,int>,ps::null_type,less<pair<int,int> >,ps::rb_tree_tag,ps::tree_order_statistics_node_update>
namespace high_precision{
string s1,s2;
const int PREABMX=5005,PRECMX=25000005;
int a[PREABMX]={0},b[PREABMX]={0},c[PRECMX]={0},resn=0,isf=0;
void init_a(){
for(int i=s1.length()-1;i>=0;i--){
int k=s1.length()-i;
a[k]=s1[i]-'0';
}
return;
}
void init_b(){
for(int i=s2.length()-1;i>=0;i--){
int k=s2.length()-i;
b[k]=s2[i]-'0';
}
return;
}
void addition(){
isf=0;
int mxn=max(s1.length(),s2.length()),jin=0;
for(int i=1;i<=mxn;i++){
c[i]=a[i]+b[i]+jin;
jin=0;
if(c[i]>=10) c[i]-=10,jin=1;
}
if(jin) resn=mxn+1,c[resn]=1;
else resn=mxn;
}
void multiplication(){
int lena=s1.length();
int lenb=s2.length();
resn=0,isf=0;
for(int i=1;i<=lenb;i++){
int jin=0;
for(int j=1;j<=lena;j++){
resn=max(resn,i+j-1);
c[i+j-1]+=b[i]*a[j]+jin;
jin=0;
if(c[i+j-1]>=10) jin=c[i+j-1]/10,c[i+j-1]%=10;
}
if(jin) c[lena+i]=jin,resn=max(resn,(int)(lena+i));
}
}
void subtraction(){
resn=0,isf=0;
int mxn=max(s1.length(),s2.length()),jin=0;
for(int i=mxn;i>=1;i--){
if(a[i]<b[i]){
swap(a,b);
isf=1;
break;
}else if(a[i]>b[i]){
break;
}
}
for(int i=1;i<=mxn;i++){
c[i]=a[i]-b[i]-jin;
jin=0;
if(c[i]<0){
c[i]+=10;
jin=1;
}
}
resn=mxn;
}
void division_int(long long x){
long long yu=0;
for(int i=s1.length();i>=1;i--){
yu=yu*10+a[i];
c[i]=yu/x;
yu=yu%x;
}
resn=s1.length();
}
void high_min(){
int lena=s1.length();
int lenb=s2.length();
int k=1;
for(int i=max(lena,lenb);i>=1;i--){
if(a[i]>b[i]){
k=2;
break;
}else if(a[i]<b[i]){
break;
}
}
if(k==1){
for(int i=lena;i>=1;i--){
c[i]=a[i];
}
resn=lena;
}else{
for(int i=lenb;i>=1;i--){
c[i]=b[i];
}
resn=lenb;
}
}
void high_max(){
int lena=s1.length();
int lenb=s2.length();
int k=1;
for(int i=max(lena,lenb);i>=1;i--){
if(a[i]>b[i]){
break;
}else if(a[i]<b[i]){
k=2;
break;
}
}
if(k==1){
for(int i=lena;i>=1;i--){
c[i]=a[i];
}
resn=lena;
}else{
for(int i=lenb;i>=1;i--){
c[i]=b[i];
}
resn=lenb;
}
}
void print(){
if(isf) printf("-"),isf=0;
int k=resn;
while(c[k]==0&&k>1) k--;
for(int i=k;i>=1;i--){
printf("%d",c[i]);
}
}
int fstring(long long x){
int k=0;
while(x){
b[++k]=x%10;
x/=10;
}
return k;
}
}
using namespace high_precision;
使用说明:粘贴至代码中,先输入s1,s2,再运行init_a(),init_b(),再运行对应的高精度函数即可
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...