C++程序设计(第二版)钱能-第6章--性能

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第6章性能6.9练习6(Exercises6)1.聪聪把素数放在一个叫prime.txt的文件中,里面大概有上千个正整数,每个正整数N(11000000)N占一行。运行结果也是每个数占一行,不过,结果中的每个数实际上是输入的正整数在素数集合中的排名,如果输入的不是素数(这太有可能了)那就输出一个0来表示。样本输入文件的内容和输出结果示例于下:prime.txt解答:#includeiostream#includefstream#includecmathusingnamespacestd;inlineintprime(intn){intcount=0;for(inti=2;i=n;i++){intj;for(j=2;j=sqrt(i);j++)if(i%j==0)break;if(jsqrt(i))count++;264513e:\ch06ezy_01↙10036}returncount;}inlineintisnumber(intn){for(inti=2;i=sqrt(n);i++)if(n%i==0)return0;returnprime(n);}intmain(){intx;ifstreamin(prime.txt);while(inx){coutisnumber(x)endl;}in.close();return0;}2.有一个无穷数列,其通项表示为:10nnan=0,1,2…构成了1,10,100,1000,……,把它连起来,就成了数串110100100010000…。问题是如何知道这数串的第i位到底是0还是1.数据存放在string01.txt中,文件一上来的第一个数占第一行,是正整数N(N100000),表明后面有N个正整数呢。后面N个正整数(1,2,3)iki…,N都符合3112ik。输出每个0或者1的时候,都要空一格,以便区分。样本输入文件的内容和输出结果示例于下:prime.txt5431476e:\ch06ezy_02↙10010解答:#includeiostream#includefstream#includevectorusingnamespacestd;intmain(){vectorintset(231,0);set[0]=1;for(inti=1,h=1;i231;i+=h){set[i]=1;h++;}ifstreamin(string01.txt);vectorinttest;intn;inn;for(intt,i=0;int;i++)test.push_back(t);for(inti=0;itest.size();i++)coutset[test[i]-1];coutendl;return0;}3.如果一个字串,通过颠来倒去的位置重组能够转变成另一个字串,那么就称为“可排列相等”。现在有一些字串对,请你逐一判断它们是否可“可排列相等”。每个字串以回车结束,每对字串之间空一行,对于每对字串,针对其是否“可排列相等”,输出“yes”或“no”。样本输入文件的内容和输出结果示例于下:于下:prime.txtOh,mygoodnessmultiplelines!ygdoo,shOmensemlusleip!tlinperplexedexdrelpere:\ch06ezy_03↙yesno解答:#includeiostream#includefstream#includestring#includealgorithmusingnamespacestd;intmain(){ifstreamin(permute.txt);for(strings,t;getline(in,s)&&getline(in,t);getline(in,s)){sort(s.begin(),s.end());sort(t.begin(),t.end());cout(s==t?yes\n:no\n);}return0;}4.文件average.in中有许多整数对,求所有整数的平均值。输入说明:整数对有多对,整数最大值不会超过10000.输出说明:平均值只有一个属数,小数点后要保留三位。样本输入文件的内容和输出结果示例于下:于下:prime.txt解答:#includeiostream#includefstream#includestring#includesstreamusingnamespacestd;intmain(){doublesum=0;cout.precision(3);ifstreamin(average.in);1100205011000e:\ch06ezy_04↙195.333for(strings;getline(in,s);){istringstreamsin(s);for(inta,b;sinab;)sum+=(a+b);}coutfixedsum/nendl;return0;}5.解答:#includeiostream#includefstream#includesstreamusingnamespacestd;intmain(){ifstreamin(team.in,ios::in);for(strings;getline(in,s);){istringstreamsin(s);intN,X,Y,R,M;sinNXYRM;if(X==1){if(Y==1)cout(M/R+1)(M%R)endl;if(Y==2)cout(M%R)(M/R+1)endl;}else{if(Y==1)cout(M*2-1)/R+1(M*2-1)%Rendl;if(Y==2)cout(M*2-1)%R(M*2-1)/R+1endl;}}return0;}6.变成绘制正弦图。输入说明输入含有不多于100组的数据,每组数据含有三个以空格隔开的字符,第一个数字字符表示周期N,范围在[1,9],N相当于正弦图横向字符数有4N+1;第二个数字字符表示振幅M,范围在[1,9],M相当于正弦图的高度;第三个字符表示正弦图的图形字符。输入说明输出的结果当然是字符的正弦图形,0~1和1~2周期的两个反向图形应该对称。每个图形之间应该换行。正弦值应四舍五入。于下:prime.txt解答:#includeiostream#includefstream#includecmath#includevector#includealgorithmusingnamespacestd;structPoint{intx,y;}zero={0,0};booloperator(constPoint&a,constPoint&b){returna.yb.y;}voiddisplay(constvectorPoint&p,charch)55*23#e:\ch06ezy_07↙*********************#########{for(intk=0,i=p[0].y;i=-p[0].y;i--){for(intn=0;kp.size()&&p[k].y==i;n=p[k++].x+1)coutstring(p[k].x-n,'')ch;coutendl;}}intmain(){ifstreamin(sin.in);charch;for(intperiod,amplitude;inperiodamplitudech;){vectorPointp(4*period+1,zero);for(inti=1;i=period*2;i++){p[i].x=i;p[i].y=amplitude*sin(i*M_PI/2/period)+0.5;p[period*2+i].x=period*2+i;p[period*2+i].y=-p[i].y;}stable_sort(p.begin(),p.end());display(p,ch);}return0;}7.现有若干行字串,每一行可以由数字、标点符号、空格符以及英文字符(包括大小写)组成。要你帮忙变成判断是否对称文,否则,就不能最大限度地发现有趣现象了。输入说明每个字符串为一行,每行结束以回车符为标志,可能有上百上千行也说不定。当字串为“000000”,输入结束。英文字符不区分大小写,即Madam亦为对称文。不要忘了“{([”与“})]”也是互为对称的。输出说明如果是对称文,则输出“Symmetry”,否则输出“NoSymmetry”。每个结论占一行。于下:symmetry.in解答:#includeiostream#includefstream#includestring#includealgorithmusingnamespacestd;intmain(){ifstreamin(symmetry.in);for(strings;getline(in,s);){if(s==000000)break;for(inti=0;is.size();i++){if(s[i]='A'&&s[i]='Z')s[i]+=32;}for(inti=0;is.size();i++){if(s[i]=='{')s[i]='}';if(s[i]=='')s[i]='';if(s[i]=='(')s[i]=')';if(s[i]=='[')s[i]=']';}stringt=s;reverse(s.begin(),s.end());cout(s==t?:Not)Symmetryendl;}return0;}MadmmadamLing121gnilKkghkkhg000000e:\ch06ezy_07↙SymmetrySymmetrySymmetryNoSymmetry8.文件change.in中有64个3000位的二进制数,在文件中以字符串的形式存放,每行只放一个数。如果是-1,那就表示输入结束。解答:#includeiostream#includefstream#includevector#includestringusingnamespacestd;constintBit=904;voidadd(string&x,conststring&y,conststring&z){for(inti=Bit-1,tmp=0;i=0;i--,tmp/=10){tmp+=y[i]-'0'+z[i]-'0';x[i]=tmp%10+'0';}}intmain(){vectorstringdata(1000,string(Bit,'0'));data[0][Bit-1]='1';for(intn=0;n2999;n++)add(data[n+1],data[n,],data[n]);ifstreamin(change.in);for(charch,i=0;i64&&inch;i++){stringa=data[2999];for(stringj=2998;j=0&&inch;j--)if(ch=='1')add(a,a,data[j]);cout(a[0]=='1'?a:a.substr(1))endl;}return0;}

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功