#include "stdafx.h"
#include <string>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <sstream>
#include <time.h>
using namespace std;
string calExponentiation(string base, int exp);
string bigNumberMultiply(string first, string second, int len);
string multiply(string first, string second, int len);
string formatterNumber(string second, int lenMax);
void dealString(string *str, string ac, int len);
string add(string AD, string BC);
void deleteZero(string *str);
void convertIntToString(int value, string *s);
void printResult(string result);
template <class T>
void convertStringToInt(T *, string);
int main()
{
string base; //基数
int exp = 0; //指数
string result; //结果
double temp = 0;
clock_t t1,t2;
/* 1. 获取输入信息 */
while(cin>>base>>exp)
{
t1 = clock();
/* 2.参数控制 */
convertStringToInt(&temp, base);
/* 3. 计算结果 */
result = calExponentiation(base, exp);
/* 4. 打印结果 */
printResult(result);
t2 = clock();
float diff = ((float)t2 - (float)t1) / CLOCKS_PER_SEC;
cout << diff << endl;
}
return 0;
}
/* 计算结果 */
string calExponentiation(string base, int exp)
{
int temp = exp;
string resultTemp = base;
if (1 == exp)
{
return base;
}
else
{
resultTemp = calExponentiation(base, exp/2);
resultTemp = bigNumberMultiply(resultTemp, resultTemp, resultTemp.size());
deleteZero(&resultTemp);
if (0 != exp % 2)
{
resultTemp = bigNumberMultiply(resultTemp, base, resultTemp.size());
deleteZero(&resultTemp);
}
}
return resultTemp;
}
/* 计算两个大数相乘 */
string bigNumberMultiply(string first, string second, int len)
{
int dotIndex1 = 0;
int dotIndex2 = 0;
int pointPos = 0;
string result;
/* 1. 找到小数点的位置 */
if (-1 != first.find('.', 0))
{
dotIndex1 = first.size() - first.find('.', 0) - 1;
dotIndex2 = second.size() - second.find('.', 0) - 1;
/* 记录计算结果小数点的位置 */
pointPos = dotIndex1 + dotIndex2;
}
else
{
/* 输入的是整数,没有小数点 */
pointPos = -1;
}
/* 如果有小数点的话,去除数小数点 */
if (-1 != pointPos)
{
first.erase(first.size() - dotIndex1 - 1, 1);
second.erase(second.size() - dotIndex2 - 1, 1);
result = multiply(first, second, len - 1);
}
else
{
result = multiply(first, second, len);
}
if (-1 == pointPos)
{
deleteZero(&result);
}
if (-1 != pointPos)
{
if (result.size() < pointPos)
{
result.insert(0, pointPos - result.size(), '0');
}
result.insert(result.size() - pointPos, 1, '.');
if ('0' != result[0])
{
result.insert(0, 1, '0');
}
}
return result;
}
/* 整数乘法,去除了小数点的乘法 */
string multiply(string first, string second, int len)
{
string result;
int len1 = 0;
int len2 = 0;
int temp1 = 0;
int temp2 = 0;
string stringTemp;
/* 1.高位补零,使得两个数的位数相同 */
first = formatterNumber(first, len);
second = formatterNumber(second, len);
/* 2.少于4位数,可以直接计算 */
if (4 >= len)
{
convertStringToInt(&temp1, first);
convertStringToInt(&temp2, second);
convertIntToString(temp1 * temp2, &stringTemp);
result += stringTemp;
return result;
}
/* 3.将first和second分别对半成两部分 */
len1 = len / 2;
len2 = len - len1;
string A = first.substr(0, len1);
string B = first.substr(len1);
string C = second.substr(0, len1);
string D = second.substr(len1);
/* 4.乘法法则,分块处理 */
int lenMax = max(len1, len2);
string AC = multiply(A, C, len1);
string AD = multiply(A, D, lenMax);
string BC = multiply(B, C, lenMax);
string BD = multiply(B, D, len2);
/* 5.处理BD,得到原位和进位 */
string sBD[] = {"", ""};
dealString(sBD, BD,len2);
/* 6.处理AD+BC的和 */
string ABCD = add(AD, BC);
/* 如果BD有进位的话,加上BD的进位 */
if ("0" != sBD[1])
{
ABCD = add(ABCD, sBD[1]);
}
/* 7.得到ACBD的进位 */
string sABCD[] = {"", ""};
dealString(sABCD, ABCD, lenMax);
/* 8.AC加上ADBC的进位 */
AC = add(AC, sABCD[1]);
result = AC + sABCD[0] + sBD[0];
return result;
}
string add(string AD, string BC)
{
string str = "";
int lenMax = max(AD.size(),BC.size());
AD = formatterNumber(AD, lenMax);
BC = formatterNumber(BC, lenMax);
int flag = 0;
int temp1 = 0;
int temp2 = 0;
string stringTemp;
for (int i = lenMax - 1; i >= 0; i--)
{
convertStringToInt(&temp1, AD.substr(i, 1));
convertStringToInt(&temp2, BC.substr(i, 1));
int t = flag + temp1 + temp2;
// 如果结果超过9,则进位当前位只保留个位数
if (t > 9)
{
flag = 1;
t = t - 10;
}
else
{
flag = 0;
}
// 拼接结果字符串
convertIntToString(t, &stringTemp);
str = stringTemp + str;
}
if (flag != 0)
{
convertIntToString(flag, &stringTemp);
str = stringTemp + str;
}
return str;
}
void dealString(string *str, string ac, int len)
{
str[0] = ac;
str[1] = "0";
if (len < ac.size())
{
int t = ac.size() - len;
str[0] = ac.substr(t);
str[1] = ac.substr(0, t);
}
else
{
string result = str[0];
for (int i = result.size(); i < len; i++)
{
result = "0" + result;
}
str[0] = result;
}
}
string formatterNumber(string second, int lenMax)
{
while (lenMax > second.length())
{
second = "0" + second;
}
return second;
}
/* 打印计算结果,主要处理结果中的0元素问题 */
void printResult(string result)
{
int dotIndex1 = result.find('.', 0);
/* 1.删除结果前面无用的0元素 */
deleteZero(&result);
/* 2.删除末尾的0 */
if (-1 != dotIndex1)
{
int len = result.size();
while ('0' == result[len - 1])
{
result.erase(len - 1, 1);
len--;
}
}
/* 3.打印结果 */
cout << result << endl;
}
void deleteZero(string *str)
{
for (int i = 0; i < str->size(); i++)
{
if ('0' == str->at(0))
{
str -> erase(0, 1);
}
else
{
/* 找到第一个非0的数则跳出循环 */
break;
}
}
}
template <class T>
void convertStringToInt(T *pValue, string s)
{
stringstream ss(s);
ss >> *pValue;
}
void convertIntToString(int value, string *s)
{
stringstream ss;
ss << value;
*s = ss.str();
}
超时了,哎,不想多写了。