您好,欢迎访问三七文档
数列排序问题描述给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1=n=200输入格式第一行为一个整数n。第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。输出格式输出一行,按从小到大的顺序输出排序后的数列。样例输入583649样例输出34689题目分析:这题水题,主要是要接触并掌握STL,STL会让程序变得简洁而且使得你省掉很多事,这里用了vector容器,再结合sort(),直接就省去了自己写排序算法了。代码如下:#includeiostream#includealgorithm#includevectorusingnamespacestd;intmain(intargc,char*argv[]){intn,val;vectorintv;cinn;for(inti=0;in;i++){cinval;v.push_back(val);}sort(v.begin(),v.end());for(inti=0;iv.size();i++)coutv[i];coutendl;return0;}十六进制转八进制问题描述给定n个十六进制正整数,输出它们对应的八进制数。输入格式输入的第一行为一个正整数n(1=n=10)。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式输出n行,每行为输入对应的八进制正整数。注意输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。样例输入239123ABC样例输出714435274提示先将十六进制数转换成某进制数,再由某进制数转换成八进制。题目分析:这题是熟悉进制之间的转化,而且要灵活得处理,数据规模大的时候怎么才能不超时。因为十六进制转成二进制是从最后一位开始四位四位转成二进制,如果从前面插入数据的话,挪动量是非常大的,所以逆序来考虑要省很多时间。之所以看到数组中的串是反的,就是因为逆序。再者用了栈结构存储结果,并输出。#includeiostream#includecstring#includecstdio#includevectorusingnamespacestd;stringstrsixteen[16]={0000,1000,0100,1100,0010,1010,0110,1110,0001,1001,0101,1101,0011,1011,0111,1111};intmain(intargc,char*argv[]){//freopen(input.txt,r,stdin);intn;cinn;cin.get();for(inti=0;in;i++){stringS,B;vectorintans;getline(cin,S);//从十六进制最后一位向前每一位转成4位的二进制,且二进制串是逆序的intpos=S.length()-1;for(;pos=0;pos--){if(S[pos]='0'&&S[pos]='9')B+=strsixteen[S[pos]-'0'];elseB+=strsixteen[S[pos]-'A'+10];}//从二进制转成八进制是三位三位转的,所以二进制串要凑成3的倍数pos=B.length();if(pos%3)B.append(3-(pos%3),'0');//三位三位得转成八进制for(pos=0;posB.length();pos+=3){intval=(B[pos]-'0')+2*(B[pos+1]-'0')+4*(B[pos+2]-'0');ans.push_back(val);}//去掉前导0if(0==ans.back())ans.pop_back();for(inti=ans.size()-1;i=0;i--)coutans[i];coutendl;}return0;}十六进制转十进制问题描述从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。样例输入FFFF样例输出65535题目分析:输入不超过8位的十六进制,十六进制一位为四位二进制,32位二进制,unsignedint型刚好够,不过可以用更大的longlong安全。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){stringstr;cinstr;longlongans=0,weight=1;for(inti=str.size()-1;i=0;i--){if(str[i]='0'&&str[i]='9'){ans+=(str[i]-'0')*weight;}elseans+=(str[i]-'A'+10)*weight;weight*=16;}coutansendl;return0;}十进制转十六进制问题描述十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。给出一个非负整数,将它表示成十六进制的形式。输入格式输入包含一个非负整数a,表示要转换的数。0=a=2147483647输出格式输出这个整数的16进制表示样例输入30样例输出1E题目分析:跟十进制转二进制差不多的,整数部分除16取余的方法。#includeiostream#includestackusingnamespacestd;intmain(intargc,char*argv[]){inta;charc[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};cina;stackchars;do{s.push(c[a%16]);a/=16;}while(a);while(!s.empty()){couts.top();s.pop();}return0;}特殊回文数问题描述123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n,编程求所有这样的五位和六位十进制数,满足各位数字之和等于n。输入格式输入一行,包含一个正整数n。输出格式按从小到大的顺序输出满足条件的整数,每个整数占一行。样例输入52样例输出899998989989998899数据规模和约定1=n=54。题目分析:题目要求是找所有5位和6位的满足条件的回文数,那么折半就是3位,枚举就够了,又要从小到大输出,那么分了两次循环,简单而且容易理解。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){intArr[5],n;cinn;//五位for(inti=100;i1000;i++){Arr[0]=i/100;Arr[1]=(i/10)%10;Arr[2]=i%10;if((Arr[0]+Arr[1])*2+Arr[2]==n)coutArr[0]Arr[1]Arr[2]Arr[1]Arr[0]endl;}//六位for(inti=100;i1000;i++){Arr[0]=i/100;Arr[1]=(i/10)%10;Arr[2]=i%10;if((Arr[0]+Arr[1]+Arr[2])*2==n)coutArr[0]Arr[1]Arr[2]Arr[2]Arr[1]Arr[0]endl;}return0;}回文数问题描述1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。输出格式按从小到大的顺序输出满足条件的四位十进制数。题目分析:水题,找自信的。只需枚举10-99之间的数字就够了,然后对称输出。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){inta,b;for(inti=10;i100;i++){a=i/10;b=i%10;coutabbaendl;}return0;}特殊的数字问题描述153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。输出格式按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。题目分析:水题,特殊的数字又名水仙花数,遍历就可以了。注:如果给个大数,那么就要得找技巧了,自己琢磨下。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){inta,b,c;for(inti=100;i1000;i++){a=i/100;b=(i/10)%10;c=i%10;if(i==a*a*a+b*b*b+c*c*c)coutiendl;}return0;}问题描述杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。下面给出了杨辉三角形的前4行:1111211331给出n,输出它的前n行。输入格式输入包含一个数n。输出格式输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。样例输入4样例输出1111211331数据规模与约定1=n=34。题目分析:可以说是个简单的递推关系:(i,j)=(i-1,j-1)+(i-1,j)j=1,j=i(i,j)=1。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){intTriangle[50][50];intn;cinn;for(inti=0;in;i++){for(intj=0;j=i;j++)if(0==j||i==j)Triangle[i][j]=1;elseTriangle[i][j]=Triangle[i-1][j-1]+Triangle[i-1][j];}for(inti=0;in;i++){for(intj=0;j=i;j++)coutTriangle[i][j];coutendl;}return0;}查找整数问题描述给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。输入格式第一行包含一个整数n。第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。第三行包含一个整数a,为待查找的数。输出格式如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。样例输入61948399样例输出2数据规模与约定1=n=1000。题目分析:水题。#includeiostreamusingnamespacestd;intmain(intargc,char*argv[]){intArr[1005],n,key;cinn;for(inti=0;in;i++)cinArr[i];cinkey;for(inti=0;in;i++)if(Arr[i]==key){couti+1endl;return0;}cout-1endl;return0;}数列特征问题描述给出n个数,找出这n个数的最大值,最小值,和。输入格式第一行为整数n,表示数的个数。第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。输出格式输出三行,每行一个整数。第
本文标题:蓝桥杯基础练习讲解
链接地址:https://www.777doc.com/doc-3487433 .html