`

C++ 大数运算模板

    博客分类:
  • C++
 
阅读更多

该模板可以算加,减,乘,除基本运算,其中加法只能是大数减小数。

 

 

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

const int maxn = 1000;

struct bign
{
	int len;
	int s[maxn];

	bign()
	{
		memset( s, 0, sizeof( s ) );
		len = 1;
	}

	bign operator = ( const char * num )
	{
		len = strlen( num );
		for( int i = 0; i < len; i++ )
		{
			s[i] = num[len-1-i] - '0';
		}
		return *this;
	}

	bign operator = ( int num )
	{
		char s[maxn];
		sprintf( s, "%d", num );
		*this = s;
		return *this;
	}

	bign( int num ) 
	{
		*this = num;
	}

	bign( const char * num )
	{
		*this = num;
	}

	string str() const
	{
		string res = "";
		for( int i = 0; i < len; i++ )
			res = (char)(s[i] + '0') + res;
		if( res == "" )
			res = "0";
		return res;
	}

	/***************************************************************************************
	运算符重载: +, +=, -, -=, *, *=, /, /=, %, %=, <, <=, >, >=, !=, ==
	***************************************************************************************/
	bign operator + ( const bign& b ) const
	{
		bign c;
		c.len = 0;
		for( int i = 0, g = 0; g || i < max( len, b.len ); i++ )
		{
			int x = g;
			if( i < len ) x += s[i];
			if( i < b.len ) x += b.s[i];
			c.s[c.len++] = x % 10;
			g = x / 10;
		}
		return c;
	}

	bign operator += ( const bign& b )
	{
		*this = *this + b;
		return *this;
	}

	bign operator - ( const bign& b ) const
	{
		bign 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];  
			if(x >= 0) g = 0;  
			else  
			{  
				g = 1;  
				x += 10;  
			}  
			c.s[c.len++] = x;  
		}  
		int n = c.len;
		for( int i = n-1; i >= 1; i-- )
			if( c.s[i] == 0 )
				c.len--;
		return c; 
	}

	bign operator -= (const bign &b)  
	{  
		*this = *this - b;  
		return *this;  
	}

	bign operator * ( const bign& b ) const
	{
		bign 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; i++)  
		{  
			c.s[i+1] += c.s[i]/10;  
			c.s[i] %= 10;  
		} 
		int n = c.len;
		for( int i = n-1; i >= 1; i-- )
			if( c.s[i] == 0 )
				c.len--;
		return c;
	}

	bign operator *= (const bign &b)  
	{  
		*this = *this * b;  
		return *this;  
	} 

	bign operator / (const bign &b)  
	{  
		bign c, f = 0;  
		for(int i = len-1; i >= 0; i--)  
		{  
			f = f*10;  
			f.s[0] = s[i];  
			while(f >= b)  
			{  
				f -= b;  
				c.s[i]++;  
			}  
		}  
		c.len = len;   
		int n = c.len;
		for( int i = n-1; i >= 1; i-- )
			if( c.s[i] == 0 )
				c.len--;
		return c;  
	}  

	bign operator /= (const bign &b)  
	{  
		*this  = *this / b;  
		return *this;  
	}  

	bign operator % (const bign &b)  
	{  
		bign r = *this / b;  
		r = *this - r*b;  
		return r;  
	}  
	bign operator %= (const bign &b)  
	{  
		*this = *this % b;  
		return *this;  
	}  

	bool operator < ( const bign& 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 bign& b ) const
	{
		return *this < b || *this == b;
	}

	bool operator > ( const bign& 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 bign& b ) const
	{
		return *this > b || *this == b;
	}

	bool operator != ( const bign& b ) const
	{
		return !(*this == b);
	}

	bool operator == ( const bign& b ) const
	{
		return !(*this > b) && !(*this < b);
	}


};


istream& operator >> ( istream &in, bign& x )
{
	string s;
	in >> s;
	x = s.c_str();
	return in;
}

ostream& operator << ( ostream &out, const bign& x )
{
	out << x.str();
	return out;
}

int main()
{
	bign a, b, c, d, e, f, g;
	while(cin>>a>>b)
	{
		c = a+b;
		d = a-b;
		e = a*b;
		f = a/b;
		g = a%b;
		cout<<"a+b"<<"="<<c<<endl; // a += b
		cout<<"a-b"<<"="<<d<<endl; // a -= b;
		cout<<"a*b"<<"="<<e<<endl; // a *= b;
		cout<<"a/b"<<"="<<f<<endl; // a /= b;
		cout<<"a%b"<<"="<<g<<endl; // a %= b;
		if(a != b) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

 

分享到:
评论

相关推荐

    大数运算模板(C++)

    本文将探讨一个特定的C++大数运算模板,该模板旨在处理正数的大数运算,包括四则运算、平方根、求末尾0的个数、求长度以及int型的组合排列。 首先,考虑大数运算中的基本概念,如排列和组合。它们是组合数学中的...

    c++的大数运算可以实现基本运算

    以下是一些关于C++大数运算的基本知识点: 1. **数据结构设计**:大数通常以逆序存储,即从最低位(个位)到最高位(高位)。这样方便从低位开始进行逐位运算,类似于人类书写数字的习惯。例如,`std::vector&lt;int&gt; ...

    大数运算类(C++实现)(代码注释详细,运行main.cpp就行,内含有可直接执行的exe文件)

    如果有表意不明的地方请各位下载的用户私聊或者留言,看到之后必定会给详细回复(该大数运算类所用的数据结构:列表并非是用c++标准库的模板类,而是用作者手打的链表实现的)(压缩包内部有exe文件可以在Windows10...

    C++大数模板。ACM必备

    处理大数的模板,C++大数模板。ACM必备

    c++大数模板,加减乘除阶乘求幂N进制

    以上就是关于"C++大数模板,加减乘除阶乘求幂N进制"的相关知识点。这些操作在密码学、分布式计算、金融计算等领域都有广泛应用。通过理解并掌握这些知识点,开发者可以编写高效且灵活的大数处理程序。

    c++大数运算,重载运算符

    运算符已经重载,界面友好,在hdu上可以跑出0ms,也适合做acm模板

    ACM大数模板(c/c++)

    ACM中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。

    大数相加通用模版

    在IT领域,尤其是在算法设计与实现中,处理大数运算是一项常见且重要的任务。当数值超过常规数据类型(如int、long等)所能表示的最大范围时,就需要采用特殊的方法来处理这些大数。《大数相加通用模板》这一主题...

    C++高精度大数模板

    虽然简略,但这种模板足够处理大部分日常的大数运算需求。 接下来是“高精度(加强版)”。加强版通常会包含更多高级功能和优化,如更高效的算法、错误检查、内存管理等。例如,它可能使用了更复杂的多精度乘法算法...

    大数模板C++版 可直接套用

    为了解决这个问题,我们可以自定义大数类来实现大数运算。本篇将详细解析标题为“大数模板C++版 可直接套用”的知识点,以及如何运用这个模板。 首先,大数模板的核心在于存储和表示大数。由于C++的内置类型无法...

    C++大数模板(推荐)

    C++大数模板是用于处理超出普通整型变量范围的大整数的一种编程技巧。在C++中,标准库并未提供内置的大数类型,因此需要自定义数据结构和运算方法来实现大数运算。本篇文章主要介绍了如何使用C++通过运算符重载来...

    C++ 实现大数阶乘的算法

    这个算法的核心在于巧妙地利用链表的数据结构来适应大数运算的需要,同时保持了代码的可读性和效率。 总的来说,理解和实现大数阶乘的算法不仅可以提高编程技能,还有助于对C++的STL和数据结构有更深入的理解。结合...

    C++可正负大数类模板

    C++大整数类,支持正负,支持比较运算,加减乘自加自减自乘等操作。

    用mfc做的具有图形界面的大数计算器

    本文将深入探讨一个使用MFC(Microsoft Foundation Classes)库和VC++(Visual C++)编写的能处理大数运算的计算器项目。这个计算器不仅实现了基本的算术运算,还特别针对大数进行了优化,可以处理超过普通整型或...

    大数运算类(支持大数的加减乘除和赋值运算).rar_源码/资料_Visual_C++_

    本资源包“大数运算类(支持大数的加减乘除和赋值运算).rar”显然旨在提供一个实现了大数运算功能的C++类库。 这个类库可能包含了若干个头文件(.h)和源文件(.cpp),用于定义和实现大数类。大数类通常基于数组或...

    C++ 大数A+B你懂得 数据结构.pdf

    这篇代码是关于使用C++实现大整数相加的程序,主要涉及数据结构、类模板以及大数运算。程序通过定义一个顺序列表(SeqList)类来存储大整数,并实现了大整数相加的功能。 首先,我们来看`SeqList`类,它是一个泛型...

    大数(高精度)模板基础教材

    ### 大数(高精度)模板基础教材 #### 一、大数概念及应用场景 大数,也称为高精度计算,通常指的是计算过程中涉及到的数值非常大或对运算的精度要求非常高的情况,传统的整型数据类型(如 int、long long 等)...

    [Tm] 001 C++ 模板.pdf

    ### C++模板编程基础知识点 #### 1. C++模板定义与基本概念 C++模板是一种允许程序员编写与数据类型无关的代码的机制。模板可以用于创建泛型函数、类或者成员函数,使得相同的操作可以应用于不同的数据类型。模板的...

    DLL反编译(C++)工具

    - "TestBigNum"、"TestWin32Dll"、"TestDate":这些可能是测试用例或示例项目,展示了如何处理大数运算、Windows API调用和日期处理等功能。 - "Tools":可能是一些辅助工具,例如代码分析、依赖检查或其他与DLL工作...

    VC实现长整数计算器

    本项目“VC实现长整数计算器”就是针对这一需求,使用Visual C++(VC)作为开发环境,实现了一个能够处理大数运算的计算器。 在VC环境下,我们通常使用C++语言进行开发。C++不内置支持大数运算,但可以通过自定义...

Global site tag (gtag.js) - Google Analytics