【算法详解-高精】(1)(我的)高精度模板

本文提供了一种高精度运算的数据结构实现方式,包括加减乘除等基本运算操作,并通过重载运算符来简化使用过程。该代码适用于处理超出标准整型或浮点型变量所能表示的大数运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是关于高精度的所有文章的开头。。。
————————————华丽的分割线————————————
声明:这里只贴代码,并不解释,详解将在后来的文章给出。。。
本代码用了operator重定义,不会的就看其他的文章吧。。。
以后的文章代码将不会给出,要代码来这里
代码:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <queue>
#include <map>
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=0;i<=n;i++)
using namespace std;

const int maxn=20001;
struct bignum
{
	int len,s[maxn];
	bignum(){memset(s,0,sizeof(s)),len=1;}
	bignum(int num){*this=num;}
	bignum(const char* num){*this=num;}
	bool operator<(const bignum&b)const
	{
		if(len!=b.len)return len<b.len;
		for(int i=len-1;i>=0;i--)
    		if(s[i]!=b.s[i])return s[i]<b.s[i];
    	return false;
  	}
	bool operator>(const bignum&b)const{return b<*this;}
	bool operator>=(const bignum&b){return !(*this<b);}
  	bool operator<=(const bignum&b){return !(b>*this);}
  	bool operator==(const bignum&b){return !(b<*this)&&!(*this<b);}
	bignum operator=(int num)
	{
		char s[maxn];
		sprintf(s,"%d",num);
    	*this=s;
    	return *this;
	}
	void clean(){while(len>1&&!s[len-1])len--;}
	bignum operator=(const char*num)
	{
    	len=strlen(num);
    	for(int i=0;i<len;i++)s[i]=num[len-i-1]-'0';
    	return *this;
	}
	bignum operator+(const bignum&a)
	{
		bignum c;
		c.len=max(len,a.len)+1;
		for(int i=0,x=0;i<c.len;++i)
		{
			c.s[i]=s[i]+a.s[i]+x;
			x=c.s[i]/10;
			c.s[i]=c.s[i]%10;
		}
		if(c.s[c.len-1]==0)--c.len;
		return c;	
	}
	bignum operator+=(const bignum&b){*this=*this+b;return *this;}
	bignum operator*(const bignum&b) 
	{
    	bignum c;
		c.len=len+b.len;
    	for(int i=0;i<len;i++)
    		for(int j=0;j<b.len;j++)
				c.s[i+j]+=s[i]*b.s[j];
    	for(int i=0;i<c.len-1;i++)
		{
    		c.s[i+1]+=c.s[i]/10;
    		c.s[i]%=10;
    	}
    	c.clean();
    	return c;
	}
	bignum operator*=(const bignum&b){*this=*this*b;return *this;}	
	bignum operator-(const bignum&b) 
	{
		bignum c;c.len=0;
		for(int i=0,g=0;i<len;i++)
		{
			int x=s[i]-g;
    		if(i<b.len)x-=b.s[i];
    		x>=0?g=0:(g=1,x+=10);
      		c.s[c.len++]=x;
    	}
    c.clean();
    return c;
	}
	bignum operator-=(const bignum&b){*this=*this-b;return *this;}
	bignum operator/(const bignum&b) 
	{
		bignum a=*this,c,b_;
		ri cnt,i,j,he;
		c.len=0;
		if(*this<b)c=0;
		else
		{
			for(i=b_.len=a.len,i--,j=b.len-1;j>=0;j--,i--)b_.s[i]=b.s[j];
			while(a<b_)for(b_.len--,i=1;i<=b_.len;i++)b_.s[i-1]=b_.s[i];b_.s[b_.len]=0;
			while(1)
			{
				cnt=0;
				while(a>=b_)a-=b_,cnt++;
				c.s[c.len++]=cnt;
				if(b_==b)break;
				for(b_.len--,i=1;i<=b_.len;i++)b_.s[i-1]=b_.s[i];b_.s[b_.len]=0;
			}
			for(i=0,j=c.len-1;i<j;i++,j--)he=c.s[i],c.s[i]=c.s[j],c.s[j]=he;
		}
		return c;
	}
	bignum operator/(ci&b){bignum a=b;return *this/a;}
	bignum operator%(const bignum&b){return *this-(*this/b*b);}
	bignum operator%(ci&a){bignum b=a;return *this-(*this/b*b);}
	bignum operator/=(const bignum&b){*this=*this/b;return *this;}
	bignum operator%=(const bignum&b){*this=*this%b;return *this;}	
};
istream&operator>>(istream &in,bignum&x)
{
	string s;
	in>>s;
	x=s.c_str();
	return in;
}
ostream&operator<<(ostream &out,const bignum&x){for(int i=x.len-1;i>=0;--i)cout<<x.s[i];return out;}

————————————华丽的分割线————————————
然后呢
然后就没了啊~~~
请期待下一篇文章

### 关于高精度加法的字符串处理模板 对于超出基本数据类型范围的大数相加操作,可以采用基于字符串表示的方法来实现高精度加法。这种方法通过逐位模拟手工计算的过程完成两数之和。 #### C++ 中使用 `string` 类型作为输入输出的数据结构 为了便于理解和编程实践,下面提供了一种利用标准库中的 `string` 来存储并处理大整数的方式: ```cpp #include <iostream> #include <vector> using namespace std; // 定义一个用于执行高精度加法的功能函数 string highPrecisionAddition(const string&amp; num1, const string&amp; num2) { vector<int> result; int carry = 0; // 进位标志 // 反向遍历两个字符串,从最低有效位开始累加每一位上的数值 for (int i = num1.size() - 1, j = num2.size() - 1; i >= 0 || j >= 0 || carry != 0;) { int sum = carry; if(i>=0){ sum += num1[i--] - '0'; } if(j>=0){ sum += num2[j--] - '0'; } carry = sum / 10; result.push_back(sum % 10); } // 将结果反转回正常顺序,并转换成字符串形式返回 string res; while (!result.empty()) { char c = result.back() + '0'; res += c; result.pop_back(); } return res; } int main(){ string a="9876543210", b="123456789"; cout << "Sum is: " << highPrecisionAddition(a,b)<< endl; } ``` 此代码片段展示了如何定义一个名为 `highPrecisionAddition` 的功能函数[^3],它接收两个以字符串形式给出的大整数,并按照上述逻辑计算其总和。此外,在主程序部分给出了具体的测试案例,验证了算法的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值