大数加减乘除等的模板以及1000以内阶乘的模板

谁借莪1个温暖的怀抱¢ 2022-07-24 10:28 180阅读 0赞
  1. #include<iostream>
  2. #include<string>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<algorithm>
  6. #include<iomanip>
  7. #include<algorithm>
  8. using namespace std;
  9. #define maxn 9999
  10. #define maxsize 1000
  11. #define dlen 4
  12. class BigNum
  13. {
  14. private:
  15. int a[1005]; //可以控制大数的位数
  16. int len; //大数长度
  17. public:
  18. BigNum(){ len = 1;memset(a,0,sizeof(a)); } //构造函数
  19. BigNum(const int); //将一个int类型的变量转化为大数
  20. BigNum(const char*); //将一个字符串类型的变量转化为大数
  21. BigNum(const BigNum &); //拷贝构造函数
  22. BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
  23. friend istream& operator>>(istream&, BigNum&); //重载输入运算符
  24. friend ostream& operator<<(ostream&, BigNum&); //重载输出运算符
  25. BigNum operator+(const BigNum &) const; //重载加法运算符,两个大数之间的相加运算
  26. BigNum operator-(const BigNum &) const; //重载减法运算符,两个大数之间的相减运算
  27. BigNum operator*(const BigNum &) const; //重载乘法运算符,两个大数之间的相乘运算
  28. BigNum operator/(const int &) const; //重载除法运算符,大数对一个整数进行相除运算
  29. BigNum operator^(const int &) const; //大数的n次方运算
  30. int operator%(const int &) const; //大数对一个int类型的变量进行取模运算
  31. bool operator>(const BigNum & T)const; //大数和另一个大数的大小比较
  32. bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较
  33. void print(); //输出大数
  34. };
  35. BigNum::BigNum(const int b) //将一个int类型的变量转化为大数
  36. {
  37. int c,d = b;
  38. len = 0;
  39. memset(a,0,sizeof(a));
  40. while(d > maxn)
  41. {
  42. c = d - (d / (maxn + 1)) * (maxn + 1);
  43. d = d / (maxn + 1);
  44. a[len++] = c;
  45. }
  46. a[len++] = d;
  47. }
  48. BigNum::BigNum(const char*s) //将一个字符串类型的变量转化为大数
  49. {
  50. int t,k,index,l,i;
  51. memset(a,0,sizeof(a));
  52. l=strlen(s);
  53. len=l/dlen;
  54. if(l%dlen)
  55. len++;
  56. index=0;
  57. for(i=l-1;i>=0;i-=dlen)
  58. {
  59. t=0;
  60. k=i-dlen+1;
  61. if(k<0)
  62. k=0;
  63. for(int j=k;j<=i;j++)
  64. t=t*10+s[j]-'0';
  65. a[index++]=t;
  66. }
  67. }
  68. BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数
  69. {
  70. int i;
  71. memset(a,0,sizeof(a));
  72. for(i = 0 ; i < len ; i++)
  73. a[i] = T.a[i];
  74. }
  75. BigNum & BigNum::operator=(const BigNum & n) //重载赋值运算符,大数之间进行赋值运算
  76. {
  77. int i;
  78. len = n.len;
  79. memset(a,0,sizeof(a));
  80. for(i = 0 ; i < len ; i++)
  81. a[i] = n.a[i];
  82. return *this;
  83. }
  84. istream& operator>>(istream & in, BigNum & b) //重载输入运算符
  85. {
  86. char ch[maxsize*4];
  87. int i = -1;
  88. in>>ch;
  89. int l=strlen(ch);
  90. int count=0,sum=0;
  91. for(i=l-1;i>=0;)
  92. {
  93. sum = 0;
  94. int t=1;
  95. for(int j=0;j<4&&i>=0;j++,i--,t*=10)
  96. {
  97. sum+=(ch[i]-'0')*t;
  98. }
  99. b.a[count]=sum;
  100. count++;
  101. }
  102. b.len =count++;
  103. return in;
  104. }
  105. ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符
  106. {
  107. int i;
  108. cout << b.a[b.len - 1];
  109. for(i = b.len - 2 ; i >= 0 ; i--)
  110. {
  111. cout.width(dlen);
  112. cout.fill('0');
  113. cout << b.a[i];
  114. }
  115. return out;
  116. }
  117. BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算
  118. {
  119. BigNum t(*this);
  120. int i,big; //位数
  121. big = T.len > len ? T.len : len;
  122. for(i = 0 ; i < big ; i++)
  123. {
  124. t.a[i] +=T.a[i];
  125. if(t.a[i] > maxn)
  126. {
  127. t.a[i + 1]++;
  128. t.a[i] -=maxn+1;
  129. }
  130. }
  131. if(t.a[big] != 0)
  132. t.len = big + 1;
  133. else
  134. t.len = big;
  135. return t;
  136. }
  137. BigNum BigNum::operator-(const BigNum & T) const //两个大数之间的相减运算
  138. {
  139. int i,j,big;
  140. bool flag;
  141. BigNum t1,t2;
  142. if(*this>T)
  143. {
  144. t1=*this;
  145. t2=T;
  146. flag=0;
  147. }
  148. else
  149. {
  150. t1=T;
  151. t2=*this;
  152. flag=1;
  153. }
  154. big=t1.len;
  155. for(i = 0 ; i < big ; i++)
  156. {
  157. if(t1.a[i] < t2.a[i])
  158. {
  159. j = i + 1;
  160. while(t1.a[j] == 0)
  161. j++;
  162. t1.a[j--]--;
  163. while(j > i)
  164. t1.a[j--] += maxn;
  165. t1.a[i] += maxn + 1 - t2.a[i];
  166. }
  167. else
  168. t1.a[i] -= t2.a[i];
  169. }
  170. t1.len = big;
  171. while(t1.a[len - 1] == 0 && t1.len > 1)
  172. {
  173. t1.len--;
  174. big--;
  175. }
  176. if(flag)
  177. t1.a[big-1]=0-t1.a[big-1];
  178. return t1;
  179. }
  180. BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算
  181. {
  182. BigNum ret;
  183. int i,j,up;
  184. int temp,temp1;
  185. for(i = 0 ; i < len ; i++)
  186. {
  187. up = 0;
  188. for(j = 0 ; j < T.len ; j++)
  189. {
  190. temp = a[i] * T.a[j] + ret.a[i + j] + up;
  191. if(temp > maxn)
  192. {
  193. temp1 = temp - temp / (maxn + 1) * (maxn + 1);
  194. up = temp / (maxn + 1);
  195. ret.a[i + j] = temp1;
  196. }
  197. else
  198. {
  199. up = 0;
  200. ret.a[i + j] = temp;
  201. }
  202. }
  203. if(up != 0)
  204. ret.a[i + j] = up;
  205. }
  206. ret.len = i + j;
  207. while(ret.a[ret.len - 1] == 0 && ret.len > 1)
  208. ret.len--;
  209. return ret;
  210. }
  211. BigNum BigNum::operator/(const int & b) const //大数对一个整数进行相除运算
  212. {
  213. BigNum ret;
  214. int i,down = 0;
  215. for(i = len - 1 ; i >= 0 ; i--)
  216. {
  217. ret.a[i] = (a[i] + down * (maxn + 1)) / b;
  218. down = a[i] + down * (maxn + 1) - ret.a[i] * b;
  219. }
  220. ret.len = len;
  221. while(ret.a[ret.len - 1] == 0 && ret.len > 1)
  222. ret.len--;
  223. return ret;
  224. }
  225. int BigNum::operator %(const int & b) const //大数对一个int类型的变量进行取模运算
  226. {
  227. int i,d=0;
  228. for (i = len-1; i>=0; i--)
  229. {
  230. d = ((d * (maxn+1))% b + a[i])% b;
  231. }
  232. return d;
  233. }
  234. BigNum BigNum::operator^(const int & n) const //大数的n次方运算
  235. {
  236. BigNum t,ret(1);
  237. int i;
  238. if(n<0)
  239. exit(-1);
  240. if(n==0)
  241. return 1;
  242. if(n==1)
  243. return *this;
  244. int m=n;
  245. while(m>1)
  246. {
  247. t=*this;
  248. for( i=1;i<<1<=m;i<<=1)
  249. {
  250. t=t*t;
  251. }
  252. m-=i;
  253. ret=ret*t;
  254. if(m==1)
  255. ret=ret*(*this);
  256. }
  257. return ret;
  258. }
  259. bool BigNum::operator>(const BigNum & T) const //大数和另一个大数的大小比较
  260. {
  261. int ln;
  262. if(len > T.len)
  263. return true;
  264. else if(len == T.len)
  265. {
  266. ln = len - 1;
  267. while(a[ln] == T.a[ln] && ln >= 0)
  268. ln--;
  269. if(ln >= 0 && a[ln] > T.a[ln])
  270. return true;
  271. else
  272. return false;
  273. }
  274. else
  275. return false;
  276. }
  277. bool BigNum::operator >(const int & t) const //大数和一个int类型的变量的大小比较
  278. {
  279. BigNum b(t);
  280. return *this>b;
  281. }
  282. void BigNum::print() //输出大数
  283. {
  284. int i;
  285. cout << a[len - 1];
  286. for(i = len - 2 ; i >= 0 ; i--)
  287. {
  288. cout.width(dlen);
  289. cout.fill('0');
  290. cout << a[i];
  291. }
  292. cout << endl;
  293. }
  294. int main()
  295. {
  296. BigNum a,b,c;
  297. cin>>a>>b;
  298. c = a*b ;
  299. c.print();
  300. return 0;
  301. }

下面的是阶乘的模板

  1. #include<stdio.h>
  2. int a[9999]={1,0},n,i,c,len,j;
  3. int main()
  4. {
  5. scanf("%d", &n);
  6. for ( len=1,j=2;j<=n; ++j)
  7. {
  8. for (c=0,i=0; i<len;++i)
  9. {
  10. a[i]= ( c+= a[i]*j ) % 100000; c/=100000;
  11. }
  12. if((a[i]=c)>0)++len;
  13. }
  14. printf("%d",a[--len]);
  15. for(;len;)
  16. printf("%05d", a[--len]);
  17. return 0;
  18. }

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读

    相关 大数

    问题描述: 输入不超过1000的正整数,输出它的 阶乘的精确结果。 解题思路: 用数组分别记录阶乘结果么每位数字。 include<stdio.h>

    相关 大数

    描述 我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它? 输入 输入一个整数m(0<m<=5000) 输出 输出m的阶乘,

    相关 大数

    用data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1

    相关 大数

    求大数阶乘前要计算下最大数阶乘的位数 以便于知道需要开多大的数组 . 第一种求法 : lg(N!)=\[lg(N\(N-1)\(N-2)\......\3\2\1