大神写的高精度模板 C/C++
来源:互联网 发布:mac ps转化为智能对象 编辑:程序博客网 时间:2024/04/29 18:41
#include <algorithm>#include <cstring>#include <iostream>#include <cstdio>using namespace std;const int MAX_N = 10000 + 10;struct BigInt{bool sign;int s[MAX_N], len;BigInt(){memset(s, 0, sizeof s);sign = false;len = 1;}BigInt(int num){memset(s, 0, sizeof s);sign = num < 0;num = abs(num);len = 1;if ( !num )len ++;while ( num ) {s[len ++] = num % 10;num /= 10;}len --;}void Read(){int f;while ( f = getchar(), !(f >= '0' && f <= '9') && f != '-' );if ( f == '-' )sign = true;elses[len ++] = f - '0';while ( f = getchar(), f >= '0' && f <= '9' )s[len ++] = f - '0';len --;for (int i = 1; i <= len>>1; i ++)swap(s[i], s[len-i+1]);if ( sign && len == 1 && !s[1] )sign = false;}void Print(){if ( sign )if ( len != 1 || s[1] )printf("-");for (int i = len; i; i --)printf("%d", s[i]);}void DelPreZero(){while ( !s[len] && len - 1 )len --;}};BigInt operator += (BigInt &a, const BigInt &b);BigInt operator -= (BigInt &a, const BigInt &b);BigInt operator *= (BigInt &a, const BigInt &b);BigInt operator /= (BigInt &a, const BigInt &b);BigInt operator %= (BigInt &a, const BigInt &b);BigInt Abs(const BigInt &a){BigInt ans = a;ans.sign = false;return ans;}bool operator < (const BigInt &a, const BigInt &b){if ( a.sign > b.sign )return true;if ( a.sign < b.sign )return false;if ( a.sign && b.sign )return Abs(a) < Abs(b);if ( a.len != b.len )return a.len < b.len;for (int i = a.len; i; i --) {if ( a.s[i] < b.s[i] )return true;else if ( a.s[i] > b.s[i] )return false;}return false;}bool operator > (const BigInt &a, const BigInt &b){return b < a;}bool operator <= (const BigInt &a, const BigInt &b){return !(a > b);}bool operator >= (const BigInt &a, const BigInt &b){return !(a < b);}bool operator == (const BigInt &a, const BigInt &b){return (a <= b && a >= b);}bool operator != (const BigInt &a, const BigInt &b){return !(a == b);}int operator ! (const BigInt &a){return a.len == 1 && !a.s[1];}BigInt operator - (const BigInt &a){BigInt ans = a;ans.sign = !a.sign;return ans;}BigInt operator - (const BigInt &a, const BigInt &b);BigInt operator + (const BigInt &a, const BigInt &b){if ( a.sign ^ b.sign ) {if ( a.sign )return Abs(b) - Abs(a);return Abs(a) - Abs(b);}if ( a.sign && b.sign )return -(Abs(a) + Abs(b));BigInt ans;ans.len = max(a.len, b.len) + 1;for (int i = 1; i <= ans.len; i ++)ans.s[i] = a.s[i] + b.s[i];for (int i = 2; i <= ans.len; i ++)ans.s[i] += ans.s[i-1] / 10, ans.s[i-1] %= 10;ans.DelPreZero();return ans;}BigInt operator - (const BigInt &a, const BigInt &b){if ( a.sign ^ b.sign ) {if ( a.sign )return -(Abs(a) + Abs(b));return Abs(a) + Abs(b);}if ( a.sign && b.sign )return Abs(b) - Abs(a);if ( a < b )return -(b - a);BigInt ans;ans.len = max(a.len, b.len);for (int i = 1; i <= ans.len; i ++)ans.s[i] = a.s[i] - b.s[i];for (int i = 2; i <= ans.len; i ++)ans.s[i] -= ans.s[i-1] < 0, ans.s[i-1] += (ans.s[i-1] < 0) * 10;ans.DelPreZero();return ans;}BigInt operator * (const BigInt &a, const BigInt &b){BigInt ans;ans.len = a.len + b.len;ans.sign = a.sign ^ b.sign;for (int i = 1; i <= a.len; i ++)for (int j = 1; j <= b.len; j ++)ans.s[i+j-1] += a.s[i] * b.s[j];for (int i = 2; i <= ans.len+1; i ++)ans.s[i] += ans.s[i-1] / 10, ans.s[i-1] %= 10;ans.DelPreZero();return ans;}BigInt operator / (const BigInt &a, const BigInt &b){BigInt ans, last = 0;ans.sign = a.sign ^ b.sign;ans.len = a.len;for (int i = a.len; i; i --) {last = last * 10 + a.s[i];int k;for (k = 0; k <= 9; k ++)if ( k * b <= last && (k+1) * b > last )break;ans.s[i] = k;last -= k * b;}ans.DelPreZero();return ans;}BigInt operator % (const BigInt &a, const BigInt &b){if ( b == 0 || b == 1 )return 0;if ( b == 2 )return a.s[1] & 1;if ( a.sign )return -(Abs(a) % Abs(b));if ( !a.sign && b.sign )return Abs(a) % Abs(b);return a - ((a / b) * b);}BigInt operator += (BigInt &a, const BigInt &b){return a = a + b;}BigInt operator -= (BigInt &a, const BigInt &b){return a = a - b;}BigInt operator *= (BigInt &a, const BigInt &b){return a = a * b;}BigInt operator /= (BigInt &a, const BigInt &b){return a = a / b;}BigInt operator %= (BigInt &a, const BigInt &b){return a = a % b;}BigInt operator ++ (BigInt &a){return a += 1;}BigInt operator ++ (BigInt &a, int){return ( a += 1 ) - 1;}BigInt operator -- (BigInt &a){return a -= 1;}BigInt operator -- (BigInt &a, int){return ( a -= 1 ) + 1;}int main(){return 0;}
- 大神写的高精度模板 C/C++
- c高精度加法模板
- 高精度c语言模板
- C++bign类高精度模板
- 高精度运算模板C语言
- 高精度模板 c++/类封装
- 第一次用c语言写的五子棋,求大神修改
- 【高精度】高精度分数[c++]
- 高精度的加法(c++)
- 圆周率PI的高精度计算(C/C++)
- 同学大神写的很棒的C/C++的Matrix库函数~~力荐
- 高精度数取余(C\C++)
- (排序和删除有问题,求大神!!!)C语言写的职工工资管理系统
- 小白C语言写高精度算法(加法)
- C语言无符号整数高精度算法试写
- C语言实现的高精度计算器
- C语言实现的高精度加法
- 高精度加法的c语言实现
- 【动态规划】新型计算机 computer.pas/c/cpp
- 【动态规划】无聊的数列 line.pas/c/cpp
- 【队列模拟】集卡片 card.pas/c/cpp
- 、写出xml schema与xml dtd文件相比较的优点。 2、完成一个xml schema文件定义,定义一个根元素水果,水果标签中包含苹果、梨、西瓜三个元素,三个元素均为字符类型。
- 【动态规划 变形】天堂 heaven.pas/c/cpp
- 大神写的高精度模板 C/C++
- 【队列模拟】11月15日的快乐 happy.pas/c/cpp
- 【最小环】心灵的抚慰 heart.pas/c/cpp
- 【动态规划】书本整理 book.pas/c/cpp
- [总结] 阶段性总结 10.18~11.09集训生活
- [NOIP注意]NOIP前必须记住的30句话
- [NOIP]自己收集总结的NOIP考纲
- 【贪心+堆优化】奶牛晒衣服 dry.pas/c/cpp
- 【枚举+优化】【队列操作】【RMQ】奶牛派对 tahort.pas/c/cpp