该模板可以算加,减,乘,除基本运算,其中加法只能是大数减小数。
#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; }
相关推荐
此模板只能处理正数的大数,包含四则运算、平方根、求末尾0个数、求长度等以及int型的组合排列
如果有表意不明的地方请各位下载的用户私聊或者留言,看到之后必定会给详细回复(该大数运算类所用的数据结构:列表并非是用c++标准库的模板类,而是用作者手打的链表实现的)(压缩包内部有exe文件可以在Windows10...
处理大数的模板,C++大数模板。ACM必备
运算符已经重载,界面友好,在hdu上可以跑出0ms,也适合做acm模板
ACM中的常用高精度模板,内容:大数加法,大数乘小数,大数乘大数,大数除法。
这是一个通用的大数模板,是用C++编的,当需要进行大数运算时可以直接套用!!
C++大整数类,支持正负,支持比较运算,加减乘自加自减自乘等操作。
基于字符串的大数运算:二进制十进制的add 、 multiply和特殊add 。 链表实用程序: Node declaration 、 print 、 create和linked list based big number add 。 文件操作:一个简单的解析器,可以解析Leetcode中最...
ACM 模板库目录小技巧 2C++手动扩栈 2输入挂 2输出挂 2用位运算快速求解全部组合数 2Java 快速输入输出 2Java 大数进制转换 3对整数的二分
本文采用费马小定理测试素数,使用Montgomery加快大数模乘运算,用C++实现RSA加密算法类库,并在64位windows平台封装成组件。在.Net平台引用此组件,实现可以对任意文件进行RSA加密操作的窗体应用程序。经过加密的...
本文采用费马小定理测试素数,使用Montgomery加快大数模乘运算,用C++实现RSA加密算法类库,并在64位windows平台封装成组件。在.Net平台引用此组件,实现可以对任意文件进行RSA加密操作的窗体应用程序。经过加密的...