宝宝心里苦,宝宝高中做OI到现在都四年多了,宝宝还要被字符串折磨,宝宝还要想好多好多细节,宝宝看着自己全对的的测试数据看到WA是懵逼的,宝宝还TM能看到超时也是蛮醉的,宝宝写完这道题今天都不想撸码了,宝宝要看片片。。。
其实宝宝看到自己160k,0ms AC还是很开心的嗯。。。
先说下想起来的这里面的坑:
1.指数可以是1,但是这时候输出结果要去掉底数中不必要的0
即 1.0000 1->1 而不是 1.0000
2.宝宝用的指数降幂的方法,就是各种平方,平方的平方这种,但是考虑到最高25次其实效果应该不是很明显,GG
3.宝宝傻了,宝宝降幂的时候一直搞错,所以大家如果也用这种方法的话,如果脑子算不过来,像宝宝一样,最好还是举个例子自己代一下,比如2的5次方啊什么的,效果明显
4.把字符串倒来倒去就会乱,一定一定一定要记清楚。。。
宝宝的思路就是把数当作字符串按手算的方法做乘法,比较重要的是要把字符串倒序这样方便处理进位
然后用指数降幂的方法减少乘法的次数,比如2^12一般说要进行11次乘法,那我看作(2^2*2)^2^2就只需要4次乘法,虽然最高25次效果不明显,但还是有优化的
然后处理数字的不必要的零可以在计算前处理也可以在计算后处理,计算器按处理的话会减少很多浪费,但是宝宝一开始没有想到,后来就懒得改的
然后宝宝对自己的AC还是很开心,160K0MS还是很棒的好么
代码如下
#include <iostream>
#include <string>
//#include <ctime>
using namespace std;
string invt(string str){
string str_inv = str;
int str_len = str.length();
for (int str_i = 0; str_i < str_len; str_i ++)
str_inv[str_i] = str[str_len-1-str_i];
return str_inv;
}
//字符串x,y相乘的计算函数
string multi(string x_m, string y_m){
int x_l = x_m.length();
int x_p = x_m.find('.');//表示有几位小数
if (x_p!=string::npos){
x_m = x_m.erase(x_p,1);
x_l -= 1;
}
else x_p = 0;
int y_l = y_m.length();
int y_p = y_m.find('.');//表示有几位小数
if (y_p!=string::npos){
y_m = y_m.erase(y_p,1);
y_l -= 1;
}
else y_p = 0;
int i,j;
int temp;
string ans(x_l+y_l+1,'0');
for (i = 0; i < x_l; i ++)
for (j = 0; j < y_l; j ++){
temp = (x_m[i]-'0')*(y_m[j]-'0');
ans[i+j] += temp%10;
ans[i+j+1] += temp/10;
}
for (i = 0; i < x_l+y_l; i ++){
ans[i+1] += (ans[i]-'0')/10;
ans[i] = (ans[i]-'0')%10+'0';
}
if (x_p+y_p){
string str1 = ans.substr(0,x_p+y_p);
string str2 = ans.substr(x_p+y_p);
ans = str1+'.'+str2;
}
if (x_p+y_p){
while(ans[0]=='0')
ans = ans.substr(1);
}
if (ans[0]=='.')
ans = ans.substr(1);
i = ans.length();
while (ans[i-1]=='0'){
ans = ans.erase(i-1);
i = ans.length();
}
return ans;
}
string power(string x_p, int exp){
//指数降次函数
if (exp == 1)
return multi(x_p,"1");
if (exp == 2)
return multi(x_p,x_p);
else if (!exp%2)
return power(power(x_p,2),exp/2);
else
return multi(power(x_p,exp-1),x_p);
}
int main()
{
string s;
int n;
//clock_t start, end;
while (cin >> s >> n){
//start = clock();
cout << invt(power(invt(s),n)) << endl;
//end = clock();
//cout << end-start << endl;
}
return 0;
}