Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用类编的,有重载运算符,但太长了# include <iostream.h> # include "integer.h" # define N 6 void print(Integer &p, int weight, int exp, bool fraction) { if (fraction) // it's a decimal fraction. { int n = weight * exp - p.digit; cout << '.'; for (int i=0; i<n; ++i) { cout << '0'; } p.print(); } else { int max = (N * exp - p.digit) > p.digit ? (N * exp - p.digit) : p.digit; char *output = new char[max + 1]; int n = max - weight * exp, j = p.digit - 1; for (int i=0; i<max+1; ++i) { if ((i != n) && (j >= 0)) { //cout << p.array[j]; output[i] = (char)(p.array[j] + '0'); --j; } else if (i == n) { //cout << '.'; output[i] = '.'; } else { //cout << '0'; output[i] = '0'; } } int d = max; cout << "d = " << d << endl; while ((output[d] == '0') || (output[d] == '.')) // 紧缩 { if (output[d] == '.') { --d; break; } --d; } cout << "d = " << d << endl; for (i=0; i<=d; ++i) { cout << output[i]; } } cout << endl; } int main() { char s[N]; int n; while (cin >> s >> n) { int j=0, digits[N], weight = 0; // 权值(非正数) bool fraction = true; if (s[0] != '0') { fraction = false; } for (int i=0; i<N; ++i) { if (s[i] != '.') { digits[j] = (int)s[i] - '0'; ++j; } else weight = N - i - 1; } /* for (i=0; i<j; ++i) { cout << digits[i]; } */ //cout << "weight = -" << weight << endl; Integer p(digits, j); p ^ n; if (weight > 0) { print(p, weight, n, fraction); } else { p.print(); } } return 0; } //: Integer.h class Integer { public: int digit; int *array; bool negative; Integer(int n); Integer(int *p, int n); ~Integer(); Integer & square(); Integer & operator = (const Integer &B); Integer & operator += (const Integer &B); Integer & operator -= (const Integer &B); Integer & operator *= (const Integer &B); Integer & operator ^ (int exp); void print(); }; ///~ //: Integer.cpp Integer::Integer(int n) { if (n < 0) { negative = true; } else negative = false; int counter = 0; int tmp = n; while (tmp >= 1) { tmp /= 10; ++counter; } digit = counter; array = new int[digit]; for (int i=0; i<digit; i++) { array[i] = n % 10; n /= 10; } } Integer::Integer(int *p, int n) { negative = false; int d = 0; while (p[d] == 0) // 紧缩 { ++d; } digit = n - d; array = new int[digit]; for (int i=0; i<digit; ++i) { array[digit-i-1] = p[d]; ++d; } } Integer::~Integer() { delete [] array; } Integer &Integer::operator = (const Integer &B) { negative = false; if (&B == this) // 检查是否自我赋值 { cout << "error:自我赋值" << endl; return *this; } digit = B.digit; array = new int[digit]; for (int i=0; i<digit; ++i) { array[i] = B.array[i]; } return *this; } Integer &Integer::operator += (const Integer &B) { negative = false; Integer &plurality = digit > B.digit ? *this : B; int max = plurality.digit; // 较大数 int min = digit < B.digit ? digit : B.digit; int *tmp = new int[max+1]; // 有可能进位 for (int i=0; i<max+1; i++) // 初始化 { tmp[i] = 0; } int sum = 0; int carry = 0; // 进位 for (i=0; i<min; i++) // 处理需要两操作数的部分。 { sum = array[i] + B.array[i] + carry; tmp[i] += (sum % 10); carry = sum / 10; } for (i=min; i<max; i++) // 有可能有进位。 { sum = plurality.array[i] + carry; tmp[i] += (sum % 10); carry = sum / 10; } tmp[max] = carry; while (tmp[max] == 0) // 紧缩 { --max; } delete [] array; array = new int[max+1]; for (i=0; i<max+1; i++) //初始化 { array[i] = 0; } digit = max + 1; for (i=0; i<digit; i++) { array[i] = tmp[i]; } delete [] tmp; return *this; } Integer &Integer::operator -= (const Integer &B) { negative = false; Integer &plurality = digit > B.digit ? *this : B; int max = plurality.digit; // 较大数 int min = digit < B.digit ? digit : B.digit; int *tmp = new int[max+1]; // 有可能进位 for (int i=0; i<max+1; i++) // 初始化 { tmp[i] = 0; } int sum = 0; int carry = 0; // 进位 for (i=0; i<min; i++) // 处理需要两操作数的部分。 { sum = array[i] + B.array[i] + carry; tmp[i] += (sum % 10); carry = sum / 10; } for (i=min; i<max; i++) // 有可能有进位。 { sum = plurality.array[i] + carry; tmp[i] += (sum % 10); carry = sum / 10; } tmp[max] = carry; while (tmp[max] == 0) // 紧缩 { --max; } delete [] array; array = new int[max+1]; for (i=0; i<max+1; i++) //初始化 { array[i] = 0; } digit = max + 1; for (i=0; i<digit; i++) { array[i] = tmp[i]; } delete [] tmp; return *this; } Integer &Integer::operator *= (const Integer &B) { negative = false; int n = digit + B.digit; int *result = new int[n]; for (int i=0; i<n; i++) //初始化 { result[i] = 0; } int product; for (i=0; i<B.digit; ++i) { for (int j=0; j<digit; j++) { product = B.array[i]*array[j] + result[i+j]; result[i+j] = product % 10; result[i+j+1] += product / 10; } } while (result[n-1] == 0) { --n; } delete [] array; array = new int[n]; for (i=0; i<n; ++i) { array[i] = result[i]; } delete [] result; digit = n; return *this; } Integer & Integer::square() { Integer tmp1 = *this; tmp1 *= *this; *this = tmp1; return *this; } Integer & Integer::operator ^ (int exp) { if (exp == 0) { Integer I(1); *this = I; return *this; } else { Integer tmp(1); tmp = *this; tmp.square(); Integer sq(1); sq = tmp; if (exp%2 == 0) //m is even { sq.operator ^(exp/2); *this = sq; } else //m is odd { sq.operator ^(exp/2); *this *= sq; } return *this; } } void Integer::print() { if (negative) { cout << '-'; } bool flag = true; for (int i=digit-1; i>=0; i--) { if (array[i] == 0 && flag) { continue; } flag = false; cout << array[i]; } } ///~ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator