求改高精度!!!
  • 板块学术版
  • 楼主Zqx_Vector_2014
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/16 09:41
  • 上次更新2025/1/16 13:21:49
查看原帖
求改高精度!!!
1279390
Zqx_Vector_2014楼主2025/1/16 09:41
typedef string::size_type type;
class high_precision{//高精度 
	private:
		typedef string::size_type type;
	public:
		vector<int> a;
		int remainder;
		static const type npos=string::npos;
		high_precision(vector<int> s){a=s;}
		high_precision(){}
		high_precision(int x){vector<int> b(x);a=b;}
		//将会覆盖过原数 
		template<class T>
		int length(T& arr){
			return sizeof(arr)/sizeof(arr.size());
		}void put(){
			for(type i=a.size()-1;i>0;i--)
				cout<<a[i]; 
		}void put(vector<int> ans){
			for(type i=ans.size()-1;i>0;i--)
				cout<<ans[i];
		}//put高精度输出 
		vector<int> operator+=(vector<int> b){
			type maxl=a.size()>b.size()?a.size():b.size();
			vector<int> c(maxl+1);
			for (type i=0;i<maxl;i++){
				c[i+1]=(a[i]+b[i]+c[i])/10;//进位
				c[i]=(a[i]+b[i]+c[i])%10;//求和
			}a=c;
			if(a[a.size()-1]==0) a.pop_back();
			if(a[0]==0) a.push_back(0);
			if(a.size()<maxl) a.push_back(0);
			if(a[0]+b[0]>=10) a.push_back(0);
			return a;
		}//高精加
		vector<int> operator-=(vector<int> b){
			string s;bool o;
			if(a.size()<b.size()||(a.size()==b.size()&&a<b)){o=1;swap(a,b);}
			else o=0;
			vector<int> c;
			for (type i=0;i<a.size();i++){
				if (a[i]<b[i]){//借位
					a[i+1]--;a[i]+=10;
				}c.push_back(a[i]-b[i]); 
			}while(c[c.size()-1]==0&&c.size()>1) c.pop_back();
			a=c;
			if(o) a.push_back(1);
			else a.push_back(0);
			return a;
		}//高精减(负数a[a.size()-1]是1,正数a[s.size()-1]是0,0就是0)
		vector<int> operator*=(vector<int> b){
			vector<int> c(a.size()+b.size());
			for (type i=0;i<a.size();i++)
				for (type j=0;j<b.size();j++){ 
					c[i+j+1]+=(c[i+j]+a[i]*b[j])/10;
					c[i+j]=(c[i+j]+a[i]*b[j])%10;
				}
			a=c;return a;
		}//高精乘高精
		vector<int> operator/=(long long int b){
			vector<int> c;
			remainder=0;//余数
			for (type i=a.size()-1;i>0;i--){
				c.push_back((remainder*10+a[i])/b);
				remainder=(remainder*10+a[i])%b;
			}while (c[c.size()-1]==0&&c.size()>1) c.pop_back();
			a=c;return a;//返回值是商,余数将会自动保存到remainder 
		}//高精除低精
		void operator=(high_precision ss){a=ss.a;}
		bool operator==(high_precision ss){return ss.a==a;}
		void push_back(int x){a.push_back(x);}
		void pop_back(){a.pop_back();}
		int find(type x){
			for(type i=0;i<a.size();i++)
				if(i==x) return i;
			return npos;
		}//寻找"x"的位置,返回数组下标
		int find(int x,int y,int z){
			for(int i=y;i<z;i++)
				if(i==x) return i;
			return npos;
		}//从y-z找"x"的位置,返回数组下标
		type size(){return a.size();}
		int operator[](int i){return a[i];}
		vector<int>::const_iterator
		begin() const _GLIBCXX_NOEXCEPT{return a.begin();}
		vector<int>::const_iterator
		end() const _GLIBCXX_NOEXCEPT{return a.end();}
};

会出现前导零、输出错误、数组越界等错误,求改

2025/1/16 09:41
加载中...