[2016-05-09][51nod][1027 大数乘法]

  • 时间:2016-05-09 22:01:19 星期一

  • 题目编号:[2016-05-09][51nod][1027 大数乘法]

  • 题目大意:给出2个大整数A,B,计算A*B的结果。

  • 分析:大数相乘,直接上模板

  1. #include<iostream>
  2. #include<iomanip>
  3. #include<string.h>
  4. using namespace std;
  5. const int dlen = 4;
  6. const int maxn = 9999;
  7. const int maxsize = 1000 + 10;
  8. class bignum{
  9. public:
  10. int a[500];
  11. int len;
  12. bignum(){
  13. len = 1;
  14. memset(a,0,sizeof(a));
  15. }
  16. bignum operator * (const bignum & t)const{
  17. bignum ret;
  18. int i,j,up;
  19. int tmp ,tmp1;
  20. for( i = 0 ; i < len ; ++i){
  21. up = 0;
  22. for( j = 0 ; j < t.len ; ++j){
  23. tmp = a[i] * t.a[j] + ret.a[i + j] + up;
  24. if(tmp > maxn){
  25. tmp1 = tmp - tmp / (maxn + 1) * (maxn + 1);
  26. up = tmp / (maxn + 1);
  27. ret.a[i + j] = tmp1;
  28. }else {
  29. up = 0;
  30. ret.a[i + j] = tmp;
  31. }
  32. }
  33. if(up){
  34. ret.a[i + j] = up;
  35. }
  36. }
  37. ret.len = i + j;
  38. while(ret.a[ret.len - 1] == 0 && ret.len > 1) --ret.len;
  39. return ret;
  40. }
  41. friend istream& operator >> (istream & in,bignum &b){
  42. char ch[maxsize * 4];
  43. int i = -1;
  44. in >> ch;
  45. int l = strlen(ch);
  46. int count = 0,sum = 0;
  47. int ed = 0;
  48. for(int i = l - 1 ; i >= ed ;){
  49. sum = 0;
  50. int t = 1;
  51. for(int j = 0 ; j < 4 && i >= ed ; ++j,--i,t*=10){
  52. sum += (ch[i] - '0') * t;
  53. }
  54. b.a[count++] =sum;
  55. }
  56. b.len = count++;
  57. return in;
  58. }
  59. friend ostream & operator << (ostream & out, const bignum &b){
  60. int i;
  61. out<<b.a[b.len - 1];
  62. for(i = b.len - 2 ; i >=0 ; --i){
  63. out<<setw(4)<<setfill('0')<<b.a[i];
  64. }
  65. return out;
  66. }
  67. };
  68. int main(){
  69. bignum a,b;
  70. cin>>a>>b;
  71. cout<<a*b<<"\n";
  72. return 0;
  73. }


来自为知笔记(Wiz)


posted on 2016-05-09 22:07  红洋  阅读(124)  评论(0)    收藏  举报

导航