您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 创业/孵化 > 蓝桥杯真题集锦2016
第1/282页1.代码设计(满分5分)625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。输出结果中,从小到大,每个找到的数字占一行。比如那个625就输出为:625代码:#includeiostreamusingnamespacestd;intshousan(intn){returnn%1000;//得到后三位}intmain(){for(inti=100;i=999;i++){if(i==shousan(i*i))coutiendl;}return0;}第2/282页运行结果:2.代码设计(满分11分)考虑方程式:a^3+b^3=c^3+d^3其中:“^”表示乘方。a、b、c、d是互不相同的小于30的正整数。这个方程有很多解。比如:a=1,b=12,c=9,d=10就是一个解。因为:1的立方加12的立方等于1729,而9的立方加10的立方也等于1729。当然,a=12,b=1,c=9,d=10显然也是解。如果不计abcd交换次序的情况,这算同一个解。你的任务是:找到所有小于30的不同的正整数解。把abcd按从小到大排列,用逗号分隔,每个解占用1行。比如,刚才的解输出为:1,9,10,12不同解间的顺序可以不考虑。代码:#includeiostreamusingnamespacestd;#includecmathintmain(){第3/282页inta,b,c,d;for(a=1;a30;a++)for(b=a+1;b30;b++)for(c=b+1;c30;c++)for(d=c+1;d30;d++){if(b*b*b+c*c*c==a*a*a+d*d*d)coutabcdendl;}return0;}运行结果:代码设计(满分18分)整数的分划问题。如,对于正整数n=6,可以分划为:65+1第4/282页4+2,4+1+13+3,3+2+1,3+1+1+12+2+2,2+2+1+1,2+1+1+1+11+1+1+1+1+1+1现在的问题是,对于给定的正整数n,编写算法打印所有划分。用户从键盘输入n(范围1~10)程序输出该整数的所有划分。整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式:n=m1+m2+...+mi;(其中mi为正整数,并且1=mi=n),则{m1,m2,...,mi}为n的一个划分。如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi)=m,则称它属于n的一个m划分。这里我们记n的m划分的个数为f(n,m);例如但n=4时,他有5个划分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};注意4=1+3和4=3+1被认为是同一个划分。该问题是求出n的所有划分个数,即f(n,n)。下面我们考虑求f(n,m)的方法;1.递归法:根据n和m的关系,考虑以下几种情况:(1)当n=1时,不论m的值为多少(m0),只有一种划分即{1};(2)当m=1时,不论n的值为多少,只有一种划分即n个1,{1,1,1,...,1};第5/282页(3)当n=m时,根据划分中是否包含n,可以分为两种情况:(a)划分中包含n的情况,只有一个即{n};(b)划分中不包含n的情况,这时划分中最大的数字也一定比n小,即n的所有(n-1)划分。因此f(n,n)=1+f(n,n-1);(4)当nm时,由于划分中不可能出现负数,因此就相当于f(n,n);(5)但nm时,根据划分中是否包含最大值m,可以分为两种情况:(a)划分中包含m的情况,即{m,{x1,x2,...xi}},其中{x1,x2,...xi}的和为n-m,因此这情况下为f(n-m,m)(b)划分中不包含m的情况,则划分中所有值都比m小,即n的(m-1)划分,个数为f(n,m-1);第五种情况中为划分中最大的整数不超过m,而不超过m则有两种情况,一种是划分中有m,此时剩下的则为n-m,那么相当于对n-m进行划分,并且划分中的最大整数不超过m;另一种情况为不包含m,那么最大整数位m-1,相当于对n进行划分,最大整数不超过m-1.因此f(n,m)=f(n-m,m)+f(n,m-1);综上所述:f(n,m)=1;(n=1orm=1)f(n,m)=f(n,n);(nm)第6/282页1+f(n,m-1);(n=m)f(n-m,m)+f(n,m-1);(nm)划分个数代码:#includeiostreamusingnamespacestd;intf(intn,intm){if(n==1||m==1)return1;elseif(nm)returnf(n,n);elseif(n==m)return1+f(n,n-1);elsereturnf(n,m-1)+f(n-m,m);}intmain(){intn;cinn;coutf(n,n);return0;第7/282页}划分情况代码:#includeiostreamusingnamespacestd;voidf(intn,inta[],intk){if(n=0){for(inti=0;ik;i++)couta[i]'';coutendl;return;}for(intj=n;j0;j--){if(k0&&ja[k-1])continue;a[k]=j;f(n-j,a,k+1);}}intmain(){inta[1000];f(10,a,0);第8/282页return0;}3、代码设计(满分20分)一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。例如:当N=3时,153就满足条件,因为1^3+5^3+3^3=153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。当N=4时,1634满足条件,因为1^4+6^4+3^4+4^4=1634。当N=5时,92727满足条件。实际上,对N的每个取值,可能有多个数字满足条件。程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。5程序设计(满分15分)从键盘输入一个整数(1~20)则以该数字为矩阵的大小,把1,2,3…n*n的数字按照顺时针螺旋的形式填入其中。例如:输入数字2,则程序输出:1243第9/282页输入数字3,则程序输出:123894765输入数字4,则程序输出:12341213145111615610987代码:#includeiostreamusingnamespacestd;#includestdio.hintmain()第10/282页{inta[21][21];intn,i=1,j=1,num=1;ints=0,x=0,z=0,y=1;//方位上s下x左z右ycinn;intb=n,b1=1;//步数544332211while(1){if(num==n*n+1)break;if(y==1){for(inti1=0;i1b;i1++){a[i][j]=num;j++;num++;}b1++;if(b1==2){b--;b1=0;}//是否修改步长x=1;y=0;//右转下第11/282页i++;j--;//校正位置}if(x==1){for(inti1=0;i1b;i1++){a[i][j]=num;i++;num++;}b1++;if(b1==2){b--;b1=0;}z=1;x=0;j--;i--;}if(z==1){第12/282页for(inti1=0;i1b;i1++){a[i][j]=num;j--;num++;}b1++;if(b1==2){b--;b1=0;}s=1;z=0;i--;j++;}if(s==1){for(inti1=0;i1b;i1++){a[i][j]=num;i--;num++;}第13/282页b1++;if(b1==2){b--;b1=0;}y=1;s=0;j++;i++;}}for(i=1;i=n;i++){for(j=1;j=n;j++)printf(%-4d,a[i][j]);coutendl;}return0;}运行结果:第14/282页6程序设计(满分9分)从键盘输入一个日期,格式为yyyy-M-d要求计算该日期与1949年10月1日距离多少天例如:用户输入了:1949-10-2程序输出:1用户输入了:1949-11-112111程序输出:313031代码:输入1949年10月以后的日期#includeiostreamusingnamespacestd;#includestdio.hintmain(){inty,m,d,sum=0;chara,b;cinyambd;第15/282页for(inti=1950;iy;i++){if(i%400==0||(i%4==0&&i%100!=0))sum+=366;elsesum+=365;}if(y==1949){for(inti=10;im;i++){if(i==10)sum+=31;if(i==11)sum+=30;}sum=d+sum-1;}else{sum=sum+91+d;for(inti=1;im;i++){if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)sum+=31;elseif(i==2)sum+=28;elsesum+=30;第16/282页}if((y%400==0||(y%4==0&&y%100!=0))&&m2)sum+=1;}coutsum;return0;}7程序设计(满分20分)任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962,75933,63954,61974]这个循环圈。请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为[0],这个可以不考虑。循环圈的输出格式仿照:[82962,75933,63954,61974]其中数字的先后顺序可以不考虑。代码:#includeiostream#includealgorithmusingnamespacestd;#includestdio.hintb[12]={0},bi=0;//保存循环圈中的数避免重复intchongzhu(intn)//返回差第17/282页{inta[5],sum1=0,sum2=0,sum3;for(inti=0;i5;i++){a[i]=n%10;n/=10;}sort(a,a+5);for(inti=0;i5;i++){sum1=sum1*10+a[i];sum2=sum2*10+a[4-i];}sum3=sum2-sum1;if(sum3==0)return0;while(sum310000)//补零{sum3*=10;}returnsum3;}第18/282页voidheidong(intn){inta[6],booll=0;a[0]=n;for(inti=1;i6;i++){a[i]=chongzhu(a[i-1]);for(intj=0;ji;j++){if(a[i]==a[j
本文标题:蓝桥杯真题集锦2016
链接地址:https://www.777doc.com/doc-5063671 .html