数组存储整数,模拟手算进行四则运算
高精度运算类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 | #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 ( "\n" ); 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); for ( int i = 0; i < len; i++) s[i] = num[len-i-1] - '0' ; return * this ; } string str() const { string res = "" ; for ( int 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; for ( int 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; for ( int i = 0; i < len; i++) for ( int j = 0; j < b.len; j++) c.s[i+j] += s[i] * b.s[j]; for ( int 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; for ( int 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; for ( int 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; } |