poj1001這題坑太多,套路很深,寶寶心裏苦

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


發佈了32 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章