zjut 1740 Find x 从此题推广到求一个数的N次方的小数精度问题
2012-02-28 23:09
330 查看
这题题意就是给定一个1~21的整数,求出其开三次方的值,保留小数点100位。这题大概的做法就是先由普通开三次方确认一个头,然后通过大数乘逐位逼近结果,因为小数比较麻烦,所以只能每次逼近一位,在逼近的字符串s1上+‘0’,给定的整数+“000”即可。因为要四舍五入,先逼近到101位,然后对最后一位进行判断修改即可。但是我逼近的方法是暴力顺序法,每个数字的复杂度大约是100位×10个数字×大数乘中100×100×2的复杂度,大约是20000000的复杂度,还不算调用函数等时间,所以随便取一个就超时了。。。只好导出来。即使顺序用二分也就缩短到3000000左右,数字一多还是不给力。用傅立叶变换处理大数乘的话,100^1.59次方左右的复杂度,即约为502654一个数字。如果要处理100以内的数字,就50000000的预处理量,勉强可以应付1s的时间。不过至此可以得到以后求此类题的一个方法。因为开3次方用我已知的方法去优化也只能处理到100以内的数字极限了,那么基本以后出到类似题只要不是防AK题类的题,直接用笨办法跑出来然后直接预处理就OK了。下面注释中卫21个预处理的代码。用时大约半分钟。。。下面是AC代码。
#include<iostream> #include<algorithm> #include<vector> #include<string> #include<cstdio> #include<cmath> #include<fstream> using namespace std; /*ofstream fout("out.txt"); string BigNumMultiply(string s1,string s2) { int i,j; reverse(s1.begin(),s1.end()); reverse(s2.begin(),s2.end()); vector<int> v(s1.length()+s2.length(),0); for(i=0;i<s1.length();i++) { for(j=0;j<s2.length();j++) { v[i+j]+=int(s1[i]-'0')*int(s2[j]-'0'); } } int jinwei=0; string s,ss; for(i=0;i<v.size();i++) { int t=v[i]+jinwei; if(i==v.size()-1 && t==0) break; jinwei=t/10; s+=char(t%10+'0'); } if(jinwei) s+=char(jinwei+'0'); //cout<<s<<endl<<endl; //s=s.substr(s.find_first_not_of('0')); reverse(s.begin(),s.end()); s=s.substr(s.find_first_not_of('0')); return s; }*/ int main() { /*string que; int i,j,k; for(k=1;k<=21;k++) { que.clear(); int tk=k; while(tk) { que+=tk%10+'0'; tk/=10; } reverse(que.begin(),que.end()); //cout<<que<<endl; //continue; string s1,s2; if(que.length()==1) s1+=int(pow(int(que[0]-'0'),1.0/3.0))+'0'; else s1+=int(pow(int(que[1]-'0'+(que[0]-'0')*10),1.0/3.0))+'0'; int jishu=1; while(jishu!=102) { que+="000"; s1+='0'; while(1) { string st=BigNumMultiply(s1,BigNumMultiply(s1,s1)); //cout<<st<<" "<<que<<endl; if(st.length()>que.length()) {s1[jishu]--;break;} else if(st.length()==que.length() && st>que) {s1[jishu]--;break;} else s1[jishu]++; } jishu++; } if(s1[s1.length()-1]>='5') { for(i=s1.length()-2;i>=0;i--) if(s1[i]!='9') {s1[i]++;break;} else s1[i]='0'; } s1.erase(s1.length()-1,1); fout<<s1[0]<<'.'<<s1.substr(1)<<endl; }*/ string res[21]={ "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "1.2599210498948731647672106072782283505702514647015079800819751121552996765139594837293965624362550942", "1.4422495703074083823216383107801095883918692534993505775464161945416875968299973398547554797056452567", "1.5874010519681994747517056392723082603914933278998530098082857618252165056242191732735442132622209570", "1.7099759466766969893531088725438601098680551105430549243828617074442959205041732162571870100201890022", "1.8171205928321396588912117563272605024282104631412196714813342979313097394593018656471417041264170721", "1.9129311827723891011991168395487602828624390503458757662106476404472342761792307560075254414772857099", "2.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "2.0800838230519041145300568243578853863378053403732621096975910802001063113972687736060566367907574867", "2.1544346900318837217592935665193504952593449421921085824892355063464111066483408001854415035432432761", "2.2239800905693155211653633767221571965186991280969230556993458086604009830829759744897580544816262737", "2.2894284851066637356160844238793540178318138415758621441981043481313485980484283008752163220618340911", "2.3513346877207574895000163399569145269158419834621751050402543115883426809965668498079116042028440641", "2.4101422641752299861283696676032728953545812899808676541641397104132917269225938338226115162268134672", "2.4662120743304701014916113231545890427354844866280537601787874102933769529228974632162987026643460501", "2.5198420997897463295344212145564567011405029294030159601639502243105993530279189674587931248725101883", "2.5712815906582353554531872087397261164279016324546962598480223762199399330306701503243515304456515102", "2.6207413942088966071416612804419962702394276457236317251027738057286998191960421088284558259890735978", "2.6684016487219448673396273719708303350958785691831018656642135869457939716720597163166815931005165410", "2.7144176165949065715180894696794892048051077694890969572843654428033085563287658494871973768515010450", "2.7589241763811206694657911083585215822527120860389360328065925021627991410870437379126321585244375545"}; int n; scanf("%d",&n); while(n--) { int m; scanf("%d",&m); printf("%s\n",res[m-1].c_str()); } }
相关文章推荐
- python默认的是17位小数的精度,但是这里有一个问题,就是当我们的计算需要使用更高的精度(超过17位小数)的时候该怎么做呢?
- 小数常量数据的一个有意思的问题
- FIND_IN_SET() vs IN(), StackOverFlow上的一个问题
- 鲜为人知的一个解决兼容性问题的利器——小数
- JS两个小数相加,精度不对问题
- printdigit打印小数的一个问题,递归(问题)
- javascript(js)浮点数字精度问题的一个解决办法。
- Page.FindControl(string id) 与母版页结合后发现的一个问题
- 用JS做计算的时候小数位不正常--Js中parseFloat()方法所产生的精度问题
- java 将小数拆分为两部分+浮点型精度丢失问题
- 讨论c/c++计算小数的精度问题
- 讨论c/c++计算小数的精度问题
- linux使用velocity出现的一个奇葩问题-Unable to find resource
- Android 开发过程中遇到了一个问题 小记录一下 ERROR: In <declare-styleable> BorderLinearLayout, unable to find attribu
- Golang小数精度问题
- 使用Android studio转换Jar包时,遇到的一个问题Could not find tools.jar.
- stackover flow 上的一个问题:Find the most common entry in an array
- js小数运算精度问题,js浮点数运算时出现精度问题
- decimal模块 --数字的精度、保留小数位数、取整问题
- 关于find命令的一个奇葩问题, 其实不奇葩------不过是软链在捣鬼而已