寶寶心裏苦,寶寶高中做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;
}