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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章