#include <iostream>
using namespace std;
#include <string>
#include <ctime>
string add(string a, string b)//算两个字符串的加法,如“123456” + “111111” = “234567”;
{
if(a == "")
return b;
else if(b == "")
return a;
if(a.length() < b.length())
{
string temp = a;
a = b;
b = temp;
}
string answer(100000, '0');//这个字符串的长度决定了结果的长度,也就是说输出的结果不能超过100000位。
int input = 0, i = 1, lengtha = a.length(), lengthb = b.length();
answer[0] = 's';
while(lengthb)
{
answer[i] = (a[--lengtha] + b[--lengthb] - 96 + input) % 10 + 48;
input = (a[lengtha] + b[lengthb] - 96 + input) >= 10 ? 1 : 0;
i++;
}
int te = lengtha ;
if(lengtha > 0)
{
while(true)
{
a[--lengtha] += input;
input = 0;
if(a[lengtha] > '9')
{
a[lengtha] = '0';
input = 1;
}
if(lengtha < 1)
{
if(input == 1)
{
a = '1' + a ;
te++;
}
break;
}
}
while(te)
answer[i++] = a[--te];
}
else if(input == 1)
answer[i++] = '1';
answer[i] = 's';
int t = answer.find('s', 1) - 1, t1 = 0;
char tt;
string s = answer.substr(1, t );
t--;
while(t1 <= t/2 )
{
tt = s[t1];
s[t1] = s[t - t1];
s[t - t1] = tt;
t1++;
}
return s;
}
string multiplication(string a)//算字符串的平方,如“123456”的平方为“15241383936”;
{
string answer = "";
long in = 0, temp = 0;
int flagl = a.length() - 1, flagr = flagl, times = 2 * flagl + 1, i = 0;
while(times--)
{
while(2 * i < flagr - flagl)
{
temp += (a[flagl + i] - 48) * (a[flagr - i] - 48);
i++;
}
temp = 2 * temp + in;
if(2 * i == flagr - flagl)
temp += (a[flagl + i] - 48) * (a[flagl + i] - 48);
answer += temp % 10 + 48;
in = temp / 10;
flagl = --flagl < 0 ? flagr--, 0 : flagl;
temp = i = 0;
}
if(in > 0)
while(in)
{
answer += in % 10 + 48;
in /= 10;
}
int t1 = 0, t2 = answer.length() - 1, t3 = t2 / 2;
char tt;
while(t1 <= t3 )
{
tt = answer[t1];
answer[t1] = answer[t2 - t1];
answer[t2 - t1] = tt;
t1++;
}
return answer;
}
string amas(string a, char b)//算字符串与一个字符的乘积,如“1234”乘 “2”为“2468”;
{
string answer;
if(b == '0') return "0";
int b1 = b - 48, length = a.length() - 1, in = 0, in1;
char temp;
while(length > -1)
{
in1 = ( a[length] - 48 ) * b1 + in;
in = in1 / 10;
temp = in1 % 10 + 48;
answer += temp;
length--;
}
if(in > 0)
answer += in + 48;
int t = answer.length() - 1, t1 = 0;
char tt;
while(t1 <= t/2 )
{
tt = answer[t1];
answer[t1] = answer[t - t1];
answer[t - t1] = tt;
t1++;
}
return answer;
}
string amass(string a, string b)//算两个字符串的乘积,求平方时没multiplication的快;
{
if(a == "")
return b;
else if(b == "")
return a;
int lengthb = b.length();
string answer1 = "";
while(lengthb--)
{
answer1 = add(amas(a, b[lengthb]), answer1);
a += '0';
}
return answer1;
}
string mi(string a, int n)
{
if(n == 0 || a == "1")
return "1";
if(n == 1)
return a;
if(n == 2)
return multiplication(a);
if(n % 2 == 0)
return mi(multiplication(a), n/2);
else
return amass(mi(multiplication(a), n/2), a);
}
int main(void)
{
int totalnum;
string a, aa;
int n;
cout << "输入底数:";
cin >> a;
cout << "输入幂数:";
cin >> n;
if(a[0] == '-')
{
a = a.substr(1, a.length() - 1);
if(n % 2 == 1)
aa = "-";
else
aa = "";
}
else
aa = "";
clock_t t1, t2;
t1 = clock();
cout << endl << "结果为:"<< aa << mi(a, n) << endl;
t2 = clock();
cout << "花费时间为::"<< (double)(t2 - t1)/1000 <<"秒!"<< endl;
return 0;
}