大数模板!

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #define UNIT 10
  6
  7 using namespace std;
  8
  9 struct Bignum
 10 {
 11     int val[105];
 12     int len;
 13
 14     Bignum ()
 15     {
 16         memset (val, 0, sizeof(val));
 17         len = 1;
 18     }
 19
 20     Bignum operator = (const int &a)
 21     {
 22         int t, p = a;
 23         len = 0;
 24         while (p >= UNIT)
 25         {
 26             t = p - (p/UNIT)*UNIT;
 27             p = p / UNIT;
 28             val[len++] = t;
 29         }
 30         val[len++] = p;
 31         return *this;
 32     }
 33
 34     Bignum operator + (const Bignum &a) const//大数加大数
 35     {
 36         Bignum x = a;
 37         int L;
 38         L = a.len > len ? a.len : len;
 39         for (int i = 0; i < L; ++i)
 40         {
 41             x.val[i] += val[i];
 42             if (x.val[i] >= UNIT)
 43             {
 44                 x.val[i+1]++;
 45                 x.val[i] -= UNIT;
 46             }
 47         }
 48         if (x.val[L] != 0)
 49             x.len = L+1;
 50         else
 51             x.len = L;
 52         return x;
 53     }
 54
 55     Bignum operator - (const Bignum &a) const
 56     {
 57         bool flag;
 58         Bignum x1, x2;
 59         if (*this > a)
 60         {
 61             x1 = *this;
 62             x2 = a;
 63             flag = 0;
 64         }
 65         else
 66         {
 67             x1 = a;
 68             x2 = *this;
 69             flag = 1;
 70         }
 71         int j, L = x1.len;
 72         for (int i = 0; i < L; ++i)
 73         {
 74             if (x1.val[i] < x2.val[i])
 75             {
 76                 j = i+1;
 77                 while (x1.val[j] == 0)
 78                     j++;
 79                 x1.val[j--]--;
 80                 while (j > i)
 81                     x1.val[j--] += UNIT-1;
 82                 x1.val[i] += UNIT-x2.val[i];
 83             }
 84             else
 85                 x1.val[i] -= x2.val[i];
 86         }
 87         while (x1.val[x1.len-1] == 0 && x1.len > 1)
 88             x1.len--;
 89         if (flag)
 90             x1.val[x1.len-1] = -x1.val[x1.len-1];
 91         return x1;
 92     }
 93
 94     Bignum operator * (const Bignum &a) const//大数乘大数
 95     {
 96         Bignum x;
 97         int i, j, up;
 98         int x1, x2;
 99         for (i = 0; i < len; i++)
100         {
101             up = 0;
102             for (j = 0; j < a.len; j++)
103             {
104                 x1 = val[i]*a.val[j] + x.val[i+j] + up;
105                 if (x1 >= UNIT)
106                 {
107                     x2 = x1 - x1/UNIT*UNIT;
108                     up = x1 / UNIT;
109                     x.val[i+j] = x2;
110                 }
111                 else
112                 {
113                     up = 0;
114                     x.val[i+j] = x1;
115                 }
116             }
117             if (up != 0)
118                 x.val[i+j] = up;
119         }
120         x.len = i + j;
121         while (x.val[x.len-1] == 0 && x.len > 1)
122             x.len--;
123         return x;
124     }
125
126     Bignum operator / (const int &a) const//大数除小数
127     {
128         Bignum x;
129         int down = 0;
130         for (int i = len-1; i >= 0; --i)
131         {
132             x.val[i] = (val[i]+down*UNIT) / a;
133             down = val[i] + down*UNIT - x.val[i]*a;
134         }
135         x.len = len;
136         while (x.val[x.len-1] == 0 && x.len > 1)
137             x.len--;
138         return x;
139     }
140
141     int operator % (const int &a) const//大数模小数
142     {
143         int x = 0;
144         for (int i = len-1; i >= 0; --i)
145             x = ((x*UNIT)%a+val[i]) % a;
146         return x;
147     }
148
149     Bignum operator ^ (const int &a) const
150     {
151         Bignum p, x;
152         x.val[0] = 1;
153         if(a < 0)
154             exit(-1);
155         if(a == 0)
156             return x;
157         if(a == 1)
158             return *this;
159         int n = a, i;
160         while(n > 1)
161         {
162             p = *this;
163             for(i = 1; (i<<1) <= n; i<<=1)
164                 p = p * p;
165             n -= i;
166             x = x * p;
167             if(n == 1)
168                 x = x * (*this);
169         }
170         return x;
171     }
172
173     bool operator > (const Bignum &a) const
174     {
175         int now;
176         if (len > a.len)
177             return true;
178         else if (len == a.len)
179         {
180             now = len - 1;
181             while (val[now] == a.val[now] && now >= 0)
182                 now--;
183             if(now >= 0 && val[now] > a.val[now])
184                 return true;
185             else
186                 return false;
187         }
188         else
189             return false;
190     }
191 };
192
193 int main()
194 {
195     /*f[0] = 1;
196     for(int i=1;i<=100;i++)
197     f[i]=f[i-1]*(4*i-2)/(i+1);//卡特兰数递推式
198     int n;
199     while(scanf("%d",&n)==1)
200     {
201         if(n==-1)
202             break;
203         f[n].print();
204     }*/
205     return 0;
206 }

时间: 2024-10-28 11:12:55

大数模板!的相关文章

timus 1547. Password Search【题意思路+大数模板】

题目地址传送门:URAL 1547 这道题需要用到大数的很多模板,推荐大家去刷刷! 题目大意:Vova忘记了在Timus OJ上面的密码了,密码是由小写字母(a~z)组成的,他只知道密码长度不大于n位,现在他需要用m台数据处理器对密码进行检索,其中检索顺序需要满足字典序.比如他的密码长度不大于2,那就需要依次检索a,b,..........,y,z,aa,ab,..........,zy,zz.输出每台数据检索器的检索区间,使得总的检索效率可以达到最高. 已知密码的总可能数不少于数据处理器个数.

ACM大数模板(支持正负整数)

之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验. 话不多说,贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 5 #define MAXBIT 1007

大数模板 poj3982

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

大数模板

1 #include<stdio.h> 2 #include<string.h> 3 #include<conio.h> 4 #include<stdlib.h> 5 #include<time.h> 6 #define N 10000 7 // 大数模板... 8 class BigNum 9 { 10 public: 11 int s[N]; //存放各位数字,s[0]为符号位,1代表正数,-1代表负数 12 //数组内高位存高位,123存在

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

水了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

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

bignum 大数模板

今天无意间看到一个很好的大数模板,能算加.减.乘.除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减.我借用了一下:(作过少许代码上的精简) 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<iostream> 6 using

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