模板——BigInteger

  1 #include <iostream>
  2 #include <cstring>
  3 #include <string>
  4 #include <vector>
  5 #include <set>
  6 #include <cstdio>
  7 #include <algorithm>
  8 using namespace std;
  9 typedef long long LL;
 10
 11
 12 struct Bign
 13 {
 14     static const int BASE=100000000;
 15     static const int WIDTH=8;
 16     vector<int>s;
 17
 18     Bign(LL n=0){*this=n;}
 19     Bign(const string& str){*this=str;}
 20     Bign operator =(LL n)
 21     {
 22         s.clear();
 23         do
 24         {
 25             s.push_back(n%BASE);
 26             n/=BASE;
 27         }while(n>0);
 28         return *this;
 29     }
 30     Bign operator =(const string& str)
 31     {
 32         s.clear();
 33         int x,len=(str.length()-1)/WIDTH+1;
 34         for(int i=0;i<len;i++)
 35         {
 36             int end=str.length()-i*WIDTH;
 37             int start=max(0,end-WIDTH);
 38             sscanf(str.substr(start,end-start).c_str(),"%d",&x);
 39             s.push_back(x);
 40         }
 41         return *this;
 42     }
 43     Bign operator +(const Bign& b)const
 44     {
 45         int len1=s.size(),len2=b.s.size();
 46         int len=max(len1,len2);
 47         int ans=0;
 48         Bign c;c.s.clear();
 49         for(int i=0;i<len||ans!=0;i++)
 50         {
 51             if(i<len1) ans+=s[i];
 52             if(i<len2) ans+=b.s[i];
 53             c.s.push_back(ans%BASE);
 54             ans/=BASE;
 55         }
 56         return c;
 57     }
 58     Bign operator -(const Bign& b)const
 59     {
 60
 61         int len1=s.size(),len2=b.s.size();
 62         Bign c;c.s.clear();
 63         int ans=0,t=0;
 64         for(int i=0;i<len1;i++)
 65         {
 66             if(i<len2) ans=s[i]-b.s[i]+t;
 67             else ans=s[i]+t;
 68             if(ans<0)
 69             {
 70                 ans+=BASE;t=-1;
 71             }
 72             else t=0;
 73             if(ans>0)c.s.push_back(ans);
 74         }
 75         return c;
 76     }
 77     Bign operator *(const Bign& b)const
 78     {
 79         Bign c;
 80         int len1=s.size(),len2=b.s.size();
 81         for(int i=0;i<len2;i++)
 82         {
 83             for(int j=0;j<len1;j++)
 84             {
 85                 Bign ans=(LL)b.s[i]*s[j];
 86                 for(int k=0;k<i+j;k++)
 87                 ans.s.insert(ans.s.begin(),0);
 88                 c=c+ans;
 89             }
 90         }
 91         return c;
 92     }
 93
 94     bool operator <(const Bign& b)const
 95     {
 96         if(s.size()!=b.s.size()) return s.size()<b.s.size();
 97         for(int i=s.size()-1;i>=0;i--)
 98             if(s[i]!=b.s[i]) return s[i]<b.s[i];
 99         return false;
100     }
101     bool operator ==(const Bign& b)const
102     {
103         if(s.size()!=b.s.size()) return false;
104         for(int i=s.size()-1;i>=0;i--)
105             if(s[i]!=b.s[i]) return false;
106         return true;
107     }
108 };
109 ostream& operator <<(ostream& out,const Bign& a)
110 {
111     out<<a.s.back();
112     char buf[10];
113     int len=a.s.size();
114     for(int i=len-2;i>=0;i--)
115     {
116         sprintf(buf,"%08d",a.s[i]);
117         out<<buf;
118     }
119     return out;
120 }
121 LL BtoL(const Bign& a)
122 {
123     LL c;
124     char buf[10];
125     string ss="";
126     int len=a.s.size();
127     sprintf(buf,"%d",a.s.back());ss+=(string)buf;
128     for(int i=len-2;i>=0;i--)
129     {
130         sprintf(buf,"%08d",a.s[i]);
131         ss+=(string)buf;
132     }
133     sscanf(ss.c_str(),"%lld",&c);
134     return c;
135 }
136 istream& operator >>(istream& in,Bign& a)
137 {
138     string s;
139     in>>s;
140     a=s;
141     return in;
142 }
时间: 2024-10-13 07:08:12

模板——BigInteger的相关文章

C++ BigInteger 大整数类模板(转)

#include <deque> #include <vector> #include <iostream> #include <string> #include <algorithm> using namespace std; class DividedByZeroException {}; class BigInteger { private: vector<char> digits; bool sign; // true for

【Java】-BigInteger大数类的使用【超强Java大数模板 总结】

1. 单元变量常用大数操作: import java.util.Scanner; import java.math.*; public class Main{ public static void main(String args[]){ Scanner cin= new Scanner(System.in); //使用Sacnner类创建cin对象 BigInteger a, b;//创建大数对象 while(cin.hasNext()){ a=cin.nextBigInteger(); b=

hdu 5047 Sawtooth--2014acm上海赛区邀请赛(附java模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5047 Sawtooth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 377    Accepted Submission(s): 116 Problem Description Think about a plane: ● One st

大数模板 poj3982

1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就好了,可是假设不能独立写出来的话,不相当于白搭吗.所以我学完c++后会手写出模板的!. 注意,这个大数模板仅仅适用于不太大的模拟,几万位,肯定会爆内存的,兴许会补上功能更强大的模板和JAVA大数模板. #include<iostream> #include<cstdio> #inclu

简单大数模板(+ - )--待完善

水了ural的dp专题前三道1009,1012,1013,都是同一个问题,只是数据规模变大了. 题意大概是这样的:求一个k进制的n位数字,满足不含前导0和不含连续两个0的个数有多少个. dp[i][0]表示第i位为0有多少个满足条件,dp[i][1]表示i位不为0满足条件的个数,则结果就是dp[n][1]; 递推关系如下: dp[i][0]=dp[i-1][1]; dp[i][1]=(dp[i-1][0]+dp[i-1][1])*k; 顺便贴上简单的大数类 1 #include<iostream

Hdu 4762 网络赛 高精度大数模板+概率

注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放,所以最后的概率为n/m^(n-1),最后通过大数模板搞定该题的化简. C++代码 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<iomanip> 5 #include

大数模板 (C ++)

上次BC遇到一个大数题目,没有大数模板和不会使用JAVA的同学们GG了,赛后从队友哪里骗出大数模板.2333333,真的炒鸡nice(就是有点长),贴出来分享一下好辣. 1 //可以处理字符串前导零 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <stack&g

大数模板(加减乘除幂次开方)

很好用的模板,但当时做题的时候从哪里找的不知道了,原作看到知会我一声我补上hhh 1 struct BigInteger 2 { 3 int len; 4 int arg[500]; 5 BigInteger(int x = 0) { 6 IntToBigInteger(x); 7 } 8 9 BigInteger(char *str) { 10 CharToBigInteger(str); 11 } 12 void print() 13 { 14 for (int i = len - 1; i

PWJ的数论模板整理

一些还没学到,但已经听说的就先copy其他博客的 数论 欧拉降幂 求a1^a2^a3^a4^a5^a6 mod m #include<cstdio> #include<cstring> const int N=1e4+11; typedef long long ll; char s[10]; int n,lens,phi[N]; ll md,a[15]; void init(){ for(int i=1;i<N;i++) phi[i]=i; for(int i=2;i<