原题参见:http://acm.pku.edu.cn/JudgeOnline/problem?id=1001 这道题最先练习C++时做过,当时还是参考了别人的代码才给过的,⊙﹏⊙b汗啊。时隔数年,重新写了一次高精度,感觉还不错,嘿嘿。 #include <iostream> #include <cstdio> #include <cstring> const int NMAX = 300; const int EVERY_NUM = 10; class BigInteger { private: friend class BigDouble; int m_num[NMAX]; int digitNum; public: BigInteger() { memset(m_num, 0, sizeof (m_num)); digitNum = 1; } BigInteger(int v) { memset(m_num, 0, sizeof (m_num)); m_num[0] = v; digitNum = 1; for (int i = 0; i < digitNum; ++i) { if (m_num[i] >= EVERY_NUM) { m_num[i + 1] += (m_num[i] / EVERY_NUM); m_num[i] %= EVERY_NUM; digitNum++; } } } BigInteger(char *s) { int len = strlen(s); for (int i = 0; i < len; ++i) m_num[i] = s[len - 1 - i] - '0'; digitNum = len; } void output() { for (int i = digitNum - 1; i >= 0; --i) printf("%d", m_num[i]); } static BigInteger product(const BigInteger &lhs, const BigInteger &rhs); //static void plus(const BigInteger &lhs, const BigInteger &rhs, BigInteger &plusAns); //private: // void reset() { memset(m_num, 0, sizeof (m_num)); } }; #if 0 void BigInteger::plus(const BigInteger &lhs, const BigInteger &rhs, BigInteger &plusAns) { plusAns.reset(); plusAns.digitNum = lhs.digitNum > rhs.digitNum ? lhs.digitNum : rhs.digitNum; for (int i = 0; i < plusAns.digitNum; ++i) { plusAns.m_num[i] += (lhs.m_num[i] + rhs.m_num[i]); if (plusAns.m_num[i] >= EVERY_NUM) { plusAns.m_num[i + 1] += (plusAns.m_num[i] / EVERY_NUM); plusAns.m_num[i] %= EVERY_NUM; if (i + 1 == plusAns.digitNum) ++plusAns.digitNum; } } } #endif BigInteger BigInteger::product(const BigInteger &lhs, const BigInteger &rhs) { BigInteger ans; ans.digitNum = lhs.digitNum + rhs.digitNum; for (int i = 0; i < lhs.digitNum; ++i) { for (int j = 0; j < rhs.digitNum; ++j) { /*int tmp = lhs.m_num[i] * rhs.m_num[j];*/ ans.m_num[i + j] += lhs.m_num[i] * rhs.m_num[j]; } for (int k = 0; k < ans.digitNum; ++k) { if (ans.m_num[k] >= EVERY_NUM) { ans.m_num[k + 1] += (ans.m_num[k] / EVERY_NUM); ans.m_num[k] %= EVERY_NUM; } } } while (ans.digitNum > 1 && ans.m_num[ans.digitNum - 1] == 0) //digitNum至少为1 --ans.digitNum; return ans; } ////值<1 //class DecimalFraction //{ //public: // DecimalFraction() { num = 0; } // DecimalFraction(BigInteger &bInt, int n) : m_bigInt(bInt), num(n) // { // } // static DecimalFraction product(const DecimalFraction &lhs, const DecimalFraction &rhs); // void output() // { // printf("."); // for (int i = 0; i < num; ++i) // { // printf("0"); // } // m_bigInt.output(); // } //private: // BigInteger m_bigInt; // int num; //紧挨小数点后0的个数 //}; // //DecimalFraction DecimalFraction::product(const DecimalFraction &lhs, const DecimalFraction &rhs) //{ // DecimalFraction productAns; // productAns.num = lhs.num + rhs.num; // productAns.m_bigInt = BigInteger::product(lhs.m_bigInt, rhs.m_bigInt); // return productAns; //} class BigDouble { public: friend class MathAlgo; BigDouble() { } BigDouble(BigInteger &bi, int n = 0) : m_bigInt(bi), nNum(n) { } void println() { //m_bigInt.println(); //确定小数点所在的数组索引号 int dIdx = nNum; int rIdx = nNum % 4; if (nNum >= m_bigInt.digitNum) { int zeros = nNum - m_bigInt.digitNum; printf("."); for (int i = 0; i < zeros; ++i) printf("0"); } for (int i = m_bigInt.digitNum - 1; i >= 0; --i) { printf("%d", m_bigInt.m_num[i]); if (i == dIdx && i != 0) printf("."); } printf("/n"); } static BigDouble product(BigDouble &lhs, BigDouble &rhs); private: BigInteger m_bigInt; int nNum;//小数点后的位数 }; BigDouble BigDouble::product(BigDouble &lhs, BigDouble &rhs) { BigDouble productAns; productAns.nNum = lhs.nNum + rhs.nNum; productAns.m_bigInt = BigInteger::product(lhs.m_bigInt, rhs.m_bigInt); return productAns; } class MathAlgo { public: static BigDouble pow(BigDouble &R, int n); }; BigDouble MathAlgo::pow(BigDouble &R, int n) { if (n == 1) return R; BigDouble ans; BigDouble tmp = MathAlgo::pow(R, n >> 1); ans = BigDouble::product(tmp, tmp); if (n & 1) ans = BigDouble::product(ans, R); return ans; } BigDouble Transform(char *s) { int len = strlen(s); char ts[20]; int idx = 0; int tsCount = 0; for (int i = 0; i < len; ++i) { if (s[i] != '.') { ts[tsCount++] = s[i]; } else idx = len - 1 - i; } //去掉最末尾的0 if (idx != 0) { while (tsCount > 0 && idx > 0 && ts[tsCount - 1] == '0') { --tsCount; --idx; } } ts[tsCount] = '/0'; BigInteger bi(ts); return BigDouble(bi, idx); } int main() { char r[10]; int n; while (scanf("%s %d", r, &n) != EOF) { BigDouble bd = Transform(r); BigDouble ans = MathAlgo::pow(bd, n); ans.println(); } return 0; }