C++高精度大整数模板
来源:互联网 发布:智能小区门禁软件 编辑:程序博客网 时间:2024/05/18 21:10
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>#include<string>using namespace std;struct Bigint { // representations and structures string a; // to store the digits int sign; // sign = -1 for negative numbers, sign = 1 otherwise // constructors Bigint() {} // default constructor Bigint( string b ) { (*this) = b; } // constructor for string // some helpful methods int size() { // returns number of digits return (int)a.size(); } Bigint inverseSign() { // changes the sign sign *= -1; return (*this); } Bigint normalize( int newSign ) { // removes leading 0, fixes sign for( int i = (int)a.size() - 1; i > 0 && a[i] == '0'; i-- ) a.erase(a.begin() + i); sign = ( a.size() == 1 && a[0] == '0' ) ? 1 : newSign; return (*this); } // assignment operator void operator = ( string b ) { // assigns a string to Bigint a = b[0] == '-' ? b.substr(1) : b; reverse( a.begin(), a.end() ); this->normalize( b[0] == '-' ? -1 : 1 ); } // conditional operators bool operator < ( const Bigint &b ) const { // less than operator if( sign != b.sign ) return sign < b.sign; if( a.size() != b.a.size() ) return sign == 1 ? a.size() < b.a.size() : a.size() > b.a.size(); for( int i = (int)a.size() - 1; i >= 0; i-- ) if( a[i] != b.a[i] ) return sign == 1 ? a[i] < b.a[i] : a[i] > b.a[i]; return false; } bool operator == ( const Bigint &b ) const { // operator for equality return a == b.a && sign == b.sign; } // mathematical operators Bigint operator + ( Bigint b ) { // addition operator overloading if( sign != b.sign ) return (*this) - b.inverseSign(); Bigint c; for(int i = 0, carry = 0; i<a.size() || i<b.size() || carry; i++ ) { carry+=(i<a.size() ? a[i]-48 : 0)+(i<b.a.size() ? b.a[i]-48 : 0); c.a += (carry % 10 + 48); carry /= 10; } return c.normalize(sign); } Bigint operator - ( Bigint b ) { // subtraction operator overloading if( sign != b.sign ) return (*this) + b.inverseSign(); int s = sign; sign = b.sign = 1; if( (*this) < b ) return ((b - (*this)).inverseSign()).normalize(-s); Bigint c; for( int i = 0, borrow = 0; i < a.size(); i++ ) { borrow = a[i] - borrow - (i < b.size() ? b.a[i] : 48); c.a += borrow >= 0 ? borrow + 48 : borrow + 58; borrow = borrow >= 0 ? 0 : 1; } return c.normalize(s); } Bigint operator * ( Bigint b ) { // multiplication operator overloading Bigint c("0"); for( int i = 0, k = a[i] - 48; i < a.size(); i++, k = a[i] - 48 ) { while(k--) c = c + b; // ith digit is k, so, we add k times b.a.insert(b.a.begin(), '0'); // multiplied by 10 } return c.normalize(sign * b.sign); } Bigint operator / ( Bigint b ) { // division operator overloading if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 ); Bigint c("0"), d; for( int j = 0; j < a.size(); j++ ) d.a += "0"; int dSign = sign * b.sign; b.sign = 1; for( int i = (int)a.size() - 1; i >= 0; i-- ) { c.a.insert( c.a.begin(), '0'); c = c + a.substr( i, 1 ); while( !( c < b ) ) c = c - b, d.a[i]++; } return d.normalize(dSign); } Bigint operator % ( Bigint b ) { // modulo operator overloading if( b.size() == 1 && b.a[0] == '0' ) b.a[0] /= ( b.a[0] - 48 ); Bigint c("0"); b.sign = 1; for( int i = (int)a.size() - 1; i >= 0; i-- ) { c.a.insert( c.a.begin(), '0'); c = c + a.substr( i, 1 ); while( !( c < b ) ) c = c - b; } return c.normalize(sign); } // output method void print() { if( sign == -1 ) putchar('-'); for( int i = (int)a.size() - 1; i >= 0; i-- ) putchar(a[i]); printf("\n"); }};
Bigint功能:
Bigint one=string("1"); 常数赋值
Bigint zero=string("0");
string n;
Bigint nn=n; //赋值
==
+
-
*
、
%
nn.print(); 输出
0 0
- 高精度大整数模板
- 模板--高精度、大整数幂取模
- C++高精度大整数模板
- 大整数类-高精度模板
- JAVA模板 大整数模板 高精度
- 高精度 大整数 计算 模板优化方向
- c语言高精度大整数加法运算
- 高精度大整数模板(n!为例)
- 高精度整数模板
- 高精度整数模板(转)
- 高精度 大整数加法
- 高精度大整数加法
- 高精度大整数类
- 大整数高精度加减乘除
- 【高精度】大整数类
- 高精度(大整数加法)
- 高精度(大整数减法)
- 高精度(大整数除法)
- hdu2181
- Maven 入门
- POJ 2411 Mondriaan's Dream (状压DP)
- 【一维动规】 regular string 正则匹配、Word Break II
- 初学一天Objective-C的总结
- C++高精度大整数模板
- POJ1979 - Red and Black
- HDU 1548 A strange lift
- hdu 1143 Tri Tiling
- android TabHost的一种用RadioButton来实现的切换
- POJ 3020 Antenna Placement ,二分图的最小路径覆盖
- eclipse 如何用 link 方式安装 SVN 插件
- zoj 1058 Currency Exchange
- Hometask--LCA