zoukankan      html  css  js  c++  java
  • [code]高精度运算

    数组存储整数,模拟手算进行四则运算

    阶乘精确值


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include<stdio.h>
    #include<string.h>
    const int maxn=3000;
    int f[maxn];
    int main()
    {
            int i,j,n;
           scanf"%d",&n);
           memset(f,0, sizeof(f));//清?零??f数?y组???
           f[0]=1;
            for(i=2;i<=n;i++)
           //乘?以??i
                   int c=0;
                   for(j=0;j<maxn;j++)
                  {
                          int s=f[j]*i+c;
                         f[j]=s%10;
                         c=s/10;
                  }
           }
            for(j=maxn-1;j>=0;j--)if (f[j])break;
            for(i=j;i>=0;i--)printf("%d" ,f[i]);
           printf" ");
           scanf"%d",&n);
            return 0;
    }

    高精度运算类bign
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    #include<cstdio>
    #include<iostream>
    #include <string>
    using namespace std;
    const int maxn = 200;
    class bign{
    public:
      int len, s[maxn];
     
      bign() {
        memset(s, 0, sizeof(s));
        len = 1;
      }
     
      bign(int num) {
        *this = num;
      }
     
      bign(const char* num) {
        *this = num;
      }
     
      bign operator = ( int num) {
        char s[maxn];
        sprintf(s, "%d", num);
        *this = s;
        return this;
      }
     
      bign operator = ( const char * num) {
        len = strlen(num);
        forint i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
        return this;
      }
     
      string str() const {
        string res = "";
        forint i = 0; i < len; i++) res = (char )(s[i] + '0')+res;
        if(res == "") res = "0" ;
        return res;
      }
     
      bign operator + ( const bign& b) const {
        bign c;
        c.len = 0;
        forint i = 0, g = 0; g || i < max(len, b.len); i++) {
          int x = g;
          if(i < len) x += s[i];
          if(i < b.len) x += b.s[i];
          c.s[c.len++] = x % 10;
          g = x / 10;
        }
        return c;
      }
     
      void clean() {
        while(len > 1 && !s[len-1]) len--;
      }
     
      bign operator * ( const bign& b) {
        bign c; c.len = len + b.len;
        forint i = 0; i < len; i++)
          for(int j = 0; j < b.len; j++)
            c.s[i+j] += s[i] * b.s[j];
        forint i = 0; i < c.len-1; i++){
          c.s[i+1] += c.s[i] / 10;
          c.s[i] %= 10;
        }
        c.clean();
        return c;
      }
     
      bign operator - ( const bign& b) {
        bign c; c.len = 0;
        forint i = 0, g = 0; i < len; i++) {
          int x = s[i] - g;
          if(i < b.len) x -= b.s[i];
          if(x >= 0) g = 0;
          else {
            g = 1;
            x += 10;
          }
          c.s[c.len++] = x;
        }
        c.clean();
        return c;
      }
     
      bool operator < (const bign& b) const{
        if(len != b.len) return len < b.len;
        forint i = len-1; i >= 0; i--)
          if(s[i] != b.s[i]) return s[i] < b.s[i];
        return false;
      }
     
      bool operator > (const bign& b) const{
        return b < * this;
      }
     
      bool operator <= (const bign& b) {
        return !(b > * this);
      }
     
      bool operator == (const bign& b) {
        return !(b < * this) && !(*this < b);
      }
     
      bign operator += ( const bign& b) {
        *this = * this + b;
        return this;
      }
     
      
    };
     
    istream& operator >> (istream &in, bign& x) {
           string s;
           in >> s;
           x = s.c_str();
            return in;
    }
     
    ostream& operator << (ostream &out, const bign& x) {
           out << x.str();
            return out;
    }
     
     
    int main() {
      bign a;
      cin >> a;
      a += "123456789123456789000000000";
      cout << a*2 << endl;
      return 0;
    }
      

  • 相关阅读:
    sed 搜索并替换
    error: call of overloaded ‘sqrt(double&)’ is ambiguous
    C++数组读入MATLAB数据
    Ubuntu 18.04 安装 Octave 5.1
    Ubuntu 18.04 安装 CUDA 9.0
    LSTM 神经网络输入输出层
    tf.nn.rnn_cell.MultiRNNCell
    w = tf.Variable(<initial-value>, name=<optional-name>)
    linux下修改环境变量
    linux内核编程学习——草稿
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/5285202.html
Copyright © 2011-2022 走看看