基本高精度模板

//基础高精度
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <ctime> #include <cmath> #include <vector> using namespace std; struct Bign { vector<int> val; Bign() { val.clear(); val.resize(1,0); return ; } Bign(const char* str) { int _n=strlen(str),data=0,base=1; for(int i=_n-1; i>=0; --i) { data=data+(str[i]-48)*base; if((_n-i)%4==0) { val.push_back(data),data=0,base=1; continue; } base*=10; } val.push_back(data); clear(); return ; } void clear() { while(val.size()>1 && val.back()==0)val.pop_back(); return ; } void resize(const int x,const int y) { val.resize(x,y); } unsigned int size()const { return val.size(); } Bign(const int temp) { char str[20]; sprintf(str,"%d",temp); Bign C(str); *this=C; } void operator=(const int temp) { Bign C(temp); *this=C; return ; } void operator=(const char* str) { Bign C(str); *this=C; return ; } int& operator[](const int pos) { return val[pos]; } Bign operator+(Bign B) { Bign A=*this,C; C.resize(max(A.size(),B.size())+1,0); for(int i=0; i<(int)C.size(); ++i) { if(i<(int)A.size())C[i]+=A[i]; if(i<(int)B.size())C[i]+=B[i]; } for(int i=0; i<(int)C.size(); ++i) { C[i+1]+=C[i]/10000; C[i]%=10000; } C.clear(); return C; } Bign operator+(const int temp) { return *this+Bign(temp); } Bign operator-(Bign B) { Bign A=*this,C; if(A<B)return Bign(0); C.resize(max(A.size(),B.size())+1,0); for(int i=0; i<(int)C.size(); ++i) { if(i<(int)A.size())C[i]+=A[i]; if(i<(int)B.size())C[i]-=B[i]; } for(int i=0; i<(int)C.size(); ++i) { if(C[i]<0) { C[i]=10000+C[i]; C[i+1]--; } } C.clear(); return C; } Bign operator-(const int temp) { return *this-Bign(temp); } Bign operator*(Bign B) { Bign A=*this,C; C.resize(A.size()+B.size()+1,0); for(int i=0; i<(int)A.size(); ++i) { for(int j=0; j<(int)B.size(); ++j) { C[i+j]+=A[i]*B[j]; } } for(int i=0; i<(int)C.size(); ++i) { C[i+1]+=C[i]/10000; C[i]%=10000; } C.clear(); return C; } Bign operator*(const int temp) { return *this*Bign(temp); } Bign operator/(Bign B) { Bign A=*this,C,R; C.resize(A.size()+1,0); for(int i=A.size()-1; i>=0; --i) { R=R*10000; R[0]=A[i]; while(R>=B) { R=R-B; C[i]++; } } C.clear(); return C; } Bign operator/(const int temp) { return *this/Bign(temp); } Bign operator%(Bign B) { Bign A=*this; return A-A/B*B; } Bign operator%(const int temp) { return *this%Bign(temp); } bool operator<(Bign B)const { if(val.size()!=B.size())return val.size()<B.size(); for(int i=size()-1; i>=0; --i) if(val[i]!=B[i])return val[i]<B[i]; return false; } bool operator>(Bign B)const { return B<*this; } bool operator==(Bign B)const { return !(*this<B)&&!(B<*this); } bool operator!=(Bign B)const { return !(*this==B); } bool operator<=(Bign B)const { return !(*this>B); } bool operator>=(Bign B)const { return !(*this<B); } void c_str(char* str) { sprintf(str,"%d",val[size()-1]); for(int i=size()-2; i>=0; --i) { char s[11]; sprintf(s,"%04d",val[i]); strcat(str,s); } return ; } }; char str1[11000],str2[1100],Ans[1100000]; int main() { Bign A,B,C; scanf("%s%s",str1,str2); A=str1; B=str2; C=A*B; C.c_str(Ans); printf("%s\n",Ans); return 0; }

 

转载于:https://www.cnblogs.com/Gster/p/4984543.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值