蓝桥杯软件大赛c真题及参考答案_第1页
蓝桥杯软件大赛c真题及参考答案_第2页
蓝桥杯软件大赛c真题及参考答案_第3页
蓝桥杯软件大赛c真题及参考答案_第4页
蓝桥杯软件大赛c真题及参考答案_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四届蓝桥杯软件大赛C/C++本科B组真题1.题目标题:高斯日记大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。高斯获得博士学位的那天日记上标着:8113请你算出高斯获得博士学位的年月日。提交答案的格式是:yyyy-mm-dd,例如:1980-03-21请严格按照格式,通过浏览器提交答案。注意:只提交这个日期,不要写其它附加内容,比如:说明性的文字。#include<stdio.h>intisLeap(inty);intnday(inty,intm,intd);voidymd(intn);intmain(void){intn=8113;intyb=1777,mb=4,db=30;//birthn=n-1+nday(yb,mb,db);intyp,np;//printfor(inti=yb;n>0;i++){yp=i;np=n;if(isLeap(i)) n-=366;else n-=365;}printf("%d-",yp);ymd(np);return0;}intnday(inty,intm,intd){intn=0;inta[2][12]={{31,28,31,30, 31, 30,31,31,30,31, 30, 31},{31,29,31,30, 31, 30,31,31,30,31, 30, 31}};for(inti=0;i<(m-1);i++) n +=a[isLeap(y)][i];n+=d;returnn;voidymd(intn){inta[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};intmp,dp;for(inti=0;n>0;i++){dp=n; mp=i;n-=a[isLeap(i)][i];}printf("%d-%d\n",mp+1,dp);}intisLeap(inty){if((y%4==0&&y%100!=0)||(y%400==0))return1;else return0;}最后答案1799-07-162.标题:马虎的算式小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。有一次,老师出的题目是:36x495=?他却给抄成了:396x45=?但结果却很戏剧性,他的答案竟然是对的!!因为36*495=396*45=17820类似这样的巧合情况可能还有很多,比如:27*594=297*54假设abcde代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如:ab*cde=adb*ce这样的算式一共有多少种呢?请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。答案直接通过浏览器提交。注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。参考答案:穷举法#include<stdio.h>intmain(){inta,b,c,d,e,n=0;for(a=1;a<=9;a++)for(b=1;b<=9;b++)for(c=1;c<=9;c++)for(d=1;d<=9;d++)for(e=1;e<=9;e++)if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)){printf("%ld\n",(a*10+b)*(c*100+d*10+e));n++;}printf("n=%d",n);return0;}运行结果:n27335,7128,10692,17830,21384,28612,33076,22686,30248,10373,14432,6930,鸵泅756&1182'2i596,28853,S91O,13365,17820,311S5,35640,4009a,13132,13464,20094;23562,9152,19448,24596,34892,48412,9911,15158,36146,41393,10692,16038,21334,37422,42768,48114,7504,16688,50064,52520,22686,16775,22S14,28853,34892,11594,23870,36146,4s422t12474,18711,,31185,37422,49896,56133,2Q3O6,27335,41393,48422,14256,2851Z,3564f),42768,49896,641达30248,240d7,32076,40095,48]14,56133,64152,50064,48412,鸵46"13132,5252&n=142Pressanykeytocontinue3.题目标题:第39级台阶小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?请你利用计算机的优势,帮助小明寻找答案。要求提交的是一个整数。注意:不要提交解答过程,或其它的辅助说明文字。分析该情景可简化为39与0和1的关系问题,还有一个限制条件,一共要走偶数步。这道题可以有两种思路,递归与排列组合,代码都不长,重在思考过程。#include<stdio.h>intn=0;intfun(intr,ints){if(r<0)return0;if(r==0&&s%2==0){n++; return0; }for(inti=1;i<=2;i++)fun(r-i,s+1);intmain(void){fun(39,0);printf("%d\n",n);return0;}完全转化为数学问题,实际上就是:n=c(38,1)+(36,3)+...+c(20,19)最后答案511670784.标题:黄金连分数黄金分割数0.61803...是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。比较简单的一种是用连分数:1黄金数= 11+ 11+ 11+ 1+...这个连分数计算的“层数”越多,它的值越接近黄金分割数。请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。小数点后3位的值为:0.618小数点后4位的值为:0.6180小数点后5位的值为:0.61803小数点后7位的值为:0.6180340(注意尾部的0,不能忽略)你的任务是:写出精确到小数点后100位精度的黄金分割值。注意:尾数的四舍五入!尾数是0也要保留!显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。分析按照题目给出的一种简单方法,可以用斐波纳契数列和模拟手算除法实现。黄金分割数实际上是相邻的两个斐波那契数的商。对于模拟手算除法,用下面代码所示的for循环即可实现。但是这种方法的精确度可能不够。#include<stdio.h>#defineF50intmain(void){unsignedlonglongintfib[1000];intf=0;inta[101];fib[0]=0;fib[1]=1;for(inti=2;fib[i]<1e18;i++){fib[i]=fib[i-1]+fib[i-2];f++;}printf("%d\n",f);unsignedlonglongintx=fib[F-2];unsignedlonglonginty=fib[F-1];for(inti=0;i<101;i++){a[i]=x/y;x=(x%y)*10;printf("%d",a[i]);}}最后答案0.61803398874989484819719595255086212205106635745185384537231876012295828219717843480838632961333205925.题目标题:前缀判断如下的代码判断needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL。比如:"abcd1234"就包含了"abc"为前缀char*prefix(char*haystack_start,char*needle_start){char*haystack=haystack_start;char*needle=needle_start;while(*haystack&&*needle){if( )returnNULL;//填空位置}〃参考答案*(haystack++)!=*(needle++)if(*needle)returnNULL;returnhaystack_start;}请分析代码逻辑,并推测划线处的代码,通过网页提交。注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!6.标题:三部排序一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!以下的程序实现了该目标。其中x指向待排序的整型数组,len是数组的长度。voidsort3p(int*x,intlen){intp=0;intleft=0;intright=len-1;while(p<=right){if(x[p]<0){intt=x[left];x[left]=x[p];x[p]=t;left++;p++;}elseif(x[p]>0){intt=x[right];x[right]=x[p];x[p]=t;right--;}else{ ;〃填空位置p++;}如果给定数组:25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0则排序后为:-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25请分析代码逻辑,并推测划线处的代码,通过网页提交注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!分析该三部排序算法的直观意思就是,负数放左边,正数放右边,零放在中间。那样,每个数就要判断一下,放在哪里,该如何移动。一边测试,一边找方法,速度还是挺快的。7.标题:错误票据某涉密单位下发了某种票据,并要在年终全部收回。每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。你的任务是通过编程,找出断号的ID和重号的ID。假设断号不可能发生在最大和最小号。要求程序首先输入一个整数N(N<100)表示后面数据行数。接着读入N行数据。每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000)每个整数代表一个ID号。要求程序输出1行,含两个整数mn,用空格分隔。其中,m表示断号ID,n表示重号ID例如:用户输入:256811910129则程序输出:79再例如:用户输入:6164178108109180155141159104182179118137184115124125129168196172189127107112192103131133169158128102110148139157140195197TOC\o"1-5"\h\z185152135 106123173122 136 174 191145116151 143 175120161134162 190149138142 146199126165 156 153 193144166170 121 171132101194187 188113130176 154177120117 150 114 183186181100 163 160167147198111 119则程序输出:105120资源约定:峰值内存消耗<64MCPU消耗<1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>intmain(){inta[10001]={0};longm,min=100000,max=0,i,n;charc;scanf("%d",&n);for(i=0;i<n;i++)while(1){scanf("%ld",&m);if(m>max)max=m;if(m<min)min=m;a[m]++;c=getchar();if(c!='')break;}for(i=min;i<=max;i++){if(a[i]==0)printf("%ld",i);if(a[i]==2)m=i;}printf("%ld",m);return0;}8.题目标题:翻硬币小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用*表示正面,用o表示反面(是小写字母,不是零)。比如,可能情形是:**00***0000如果同时翻转左边的两个硬币,则变为:0000***0000现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作,那么要求:程序输入:两行等长的字符串,分别表示初始状态和要达到的目标状态。每行的长度<1000程序输出:一个整数,表示最小操作步数例如:用户输入:0****0****程序应该输出:5再例如:用户输入:*0**0***0****0***0**0***程序应该输出:1资源约定:峰值内存消耗<64MCPU消耗<1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案#include<stdi0.h>#include<string.h>#defineMAX1000+10intminu[MAX],sub[MAX],sq[MAX];intx;intmain(){voidsqrt_int(char*,int);charn[MAX],m[MAX];scanf("%s",n);scanf("%s",m);inta[MAX],b[MAX],s[MAX],S[MAX];intc,i,j,k,na,nb;intlen_n,len_m;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(s,0,sizeof(s));memset(S,0,sizeof(S));len_n=strlen(n),len_m=strlen(m);sqrt_int(n,len_n);for(na=x,i=0;x>=0;i++)a[i]=sq[x--];sqrt_int(m,len_m);for(nb=x,i=0;x>=0;i++)b[i]=sq[x--];for(i=0;i<=na;i++){for(k=i,c=j=0;j<=nb+1;j++,k++){s[k]=(a[i]*b[j])%10+c;c=(a[i]*b[j])/10;if(s[k]>=10){s[k]-=10;c++;}S[k]+=s[k];if(S[k]>=10){S[k]-=10;S[k+1]++;}}}for(i=MAX-1;i>=0;i--)if(S[i])break;for(j=i;j>=0;j--)printf("%d",S[j]);putchar('\n');return0;}voidsqrt_int(char*minu_char,intlen){inti,j,k,m;ints,c,flag;intfirst,num;memset(minu,0,sizeof(minu));memset(sub,0,sizeof(sub));memset(sq,0,sizeof(sq));if(len%2){minu[0]=minu_char[0]-'0';for(num=3;num>=0;num--)if(minu[0]>=num*num)break;sq[x=0]=num;minu[0]-=num*num;first=1;}else{sq[x=0]=0;first=0;}for(i=first;i<len;i+=2){minu[i]=minu_char[i]-'0';minu[i+1]=minu_char[i+1]-'0';memset(sub,0,sizeof(sub));for(k=9;k>=0;k--){sub[i+1]=k;c=0;for(m=i,j=x;j>=0;j--,m--){s=sq[j]*2;sub[m]=s%10+c;c=s/10;}sub[m]=c;c=0;for(m=i+1;m>=0;m--){s=sub[m]*k;sub[m]=s%10+c;c=s/10;if(sub[m]>=10){sub[m]-=10;c++;}}for(flag=m=0;m<=i+1;m++){if(minu[m]<sub[m]){flag=1;break;}elseif(minu[m]>sub[m])break;}if(!flag){for(m=i+1;m>=0;m--){if(minu[m]<sub[m]){minu[m]+=10;minu[m-1]--;}minu[m]-=sub[m];}sq[++x]=k;break;}elsememset(sub,0,sizeof(sub));}}}9.标题:带分数100可以表示为带分数的形式:100=3+69258/714还可以表示为:100=82+3546/197注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这样的带分数,100有11种表示法。题目要求:从标准输入读入一个正整数N(N<1000*1000)程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。注意:不要求输出每个表示,只统计有多少表示法!例如:用户输入:100程序输出:11再例如:用户输入:105程序输出:6资源约定:峰值内存消耗<64MCPU消耗<3000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>#include<stdlib.h>typedefstructInterval{intpre;intrear;intsatisfy;}Interval;Intervalinterval[7][5];intcount=0;//初始化voidInit(){inti,j;intvalue;for(i=1;i<7;i++){value=i;for(j=1;j<5;j++){interval[i][j].pre=value++;interval[i][j].rear=value;}}}//数组初始化为0voidInitZero(int*sign){inti;sign[0]=1;for(i=1;i<10;i++){sign[i]=0;}}//将一个数的各个位上拆分,并在相应的位上赋值1intSplit(int*sign,intvalue){intindex;while(value){index=value%10;if(sign[index]==0)sign[index]=1;elsereturn1;value/=10;}return0;}}//计算一个数的位数intCountBit(intvalue){intn=0;while(value){n++;value/=10;}returnn;}//将一个整型数组转换成一个整数intCreateInteger(int*data,intn){inti;intvalue=0;for(i=0;i<n;i++){value=value*10+data[i];}returnvalue;}//检查是否每个数都用到intCheck(int*sign){inti;for(i=1;i<10;i++){if(sign[i]==0)return0;}return1;}//复制voidCopy(int*sign,int*temp_sign){inti;for(i=0;i<10;i++){temp_sign[i]=sign[i];}〃创建一个n位数的整数voidCreateNBitNumber(int*sign,int*data,intn,intm,intvalue,intvalue3){if(n==m){intvalue1=CreateInteger(data,n);intvalue2=value1*value;inttemp_sign[10];Copy(sign,temp_sign);if(!Split(temp_sign,value2)&&Check(temp_sign)){count++;}}else{inti;for(i=1;i<10;i++){if(sign[i]==0){sign[i]=1;data[m]=i;CreateNBitNumber(sign,data,n,m+1,value,value3);sign[i]=0;}}}}//求出解voidCreate(intvalue){inti,j;intsign[10];intresult;intresult_n;intn;for(i=3;i<value;i++){InitZero(sign);if(Split(sign,i))continue;result=value-i;result_n=CountBit(result);n=CountBit(i);for(j=1;j<5;j++){if(((interval[result_n][j].pre+j)==(9-n))||((interval[result_n][j].rear+j)==(9-n))){intdata[5];CreateNBitNumber(sign,data,j,0,result,i);}}}}intmain(){intvalue;scanf("%d",&value);Init();Create(value);printf("%d\n",count);return0;}10.标题:连号区间数小明这些天一直在思考这样一个奇怪而有趣的问题:在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间[L,R]里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的“连续”数列,则称这个区间连号区间。当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助。输入格式:第一行是一个正整数N(1<=N<=50000),表示全排列的规模。第二行是N个不同的数字Pi(1<=Pi<=N),表示这N个数字的某一全排列。输出格式:输出一个整数,表示不同连号区间的数目。示例:用户输入:43241程序应输出:7用户输入:534251程序应输出:9解释:第一个用例中,有7个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4]第二个用例中,有9个连号区间分别是:[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[3,3],[4,4],[5,5]资源约定:峰值内存消耗<64MCPU消耗<5000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>intmain(){ints[50005],a,i,min,max,count=0,j;scanf("%d",&a);for(i=0;i<a;i++){scanf("%d",&s[i]);}for(i=0;i<a;i++){min=s[i];max=s[i];for(j=i;j<a;j++){if(min>s[j]){min=s[j];}if(max<s[j]){max=s[j];}if((max-min)==(j-i)){count++;}}}printf("%d",count);return0;}第四届蓝桥杯软件大赛C/C++高职高专组真题1.题目标题:猜年龄美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你推算一下,他当时到底有多年轻。通过浏览器,直接提交他那时的年龄数字。注意:不要提交解答过程,或其它的说明文字。参考答案:#include<stdio.h>intmain(){intx,y,a,b,c,d,e,f,g,h,i,k,j;for(j=10;j<100;j++){y=j*j*j;if(y>=1000&&y<10000){x=j*j*j*j;if(x>=100000&&x<1000000){a=y%10;b=(y/10)%10;c=(y/100)%10;d=(y/1000);e=x%10;f=(x/10)%10;g=(x/100)%10;h=(x/1000)%10;i=(x/10000)%10;k=(x/100000);if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&a!=k)if(b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&b!=k)if(c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&c!=k)if(d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&d!=k)if(e!=f&&e!=g&&e!=h&&e!=i&&e!=k)if(f!=h&&f!=g&&f!=i&&f!=k)if(h!=g&&h!=i&&h!=k)if(g!=i&&g!=k)if(i!=k)printf("%d\n",j);return0;}3.标题:振兴中华小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)从我做起振我做起振兴做起振兴中起振兴中华比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?答案是一个整数,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。从我做起振我做起振他起振兴中起振兴申华分析由于数据规模比较小,可以不用编程实现,直接一条一条路线的数数。比较好的方法是从上往下、从右往左的数,这样前面数过的路线刚好可以应用到后面的数数中。1=11+2=3+3=66+4=1010+5=15所有路线加起来即可得到答案。当然这题也可以使用深度优先实现,代码也很简单。把“从我做起振兴中华”8个字替换为0~7的8个数字。使用深度优先算法可以很方便的得出结果。#include<iostream>#include<cmath>#include<cstring>usingnamespacestd;TOC\o"1-5"\h\zintmap[4][5]={{0, 1, 2, 3, 4},{1, 2, 3, 4, 5},{2, 3, 4, 5, 6},{3, 4, 5, 6, 7}};intcnt=0;intvis[4][5];voiddfs(inta,intb){//cout<<"dfs"<<a<<""<<b<<endl;if(vis[a][b]){return;}if(a==3&&b==4){cnt++;return;}vis[a][b]=1;for(inti=-1;i<=1;i++){for(intj=-1;j<=1;j++){if(i==j||abs(i)==abs(j)){continue;}intnewa=a+i;intnewb=b+j;if(newa<0||newa>=4||newb<0||newb>=5){continue;if(map[newa][newb]-map[a][b]==1){dfs(newa,newb);}}}vis[a][b]=0;}intmain(void){memset(vis,0,sizeof(vis));dfs(0,0);cout<<cnt<<endl;return0;}.标题:幻方填空幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。他把1,2,3,...16这16个数字填写在4x4的方格中。如图p1.jpg所示,16??13??11?9??*?15?1表中有些数字已经显露出来,还有些用?和*代替。请你计算出?和*所代表的数字。并把*所代表的数字作为本题答案提交。答案是一个整数,请通过浏览器直接提交该数字。注意:不要提交解答过程,或其它辅助说明类的内容。解题方法:(1)先求幻和:(1+2+3+4+„„+16)/4=34TOC\o"1-5"\h\z163 2135 101189 6 7124 15 1415.题目标题:公约数公倍数我们经常会用到求两个整数的最大公约数和最小公倍数的功能。下面的程序给出了一种算法。函数myfunc接受两个正整数a,b经过运算后打印出它们的最大公约数和最小公倍数。此时,调用myfunc(15,20)将会输出:560//交换数值voidswap(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;voidmyfunc(inta,intb){intm,n,r;if(a<b)swap(&a,&b);m=a;n=b;r=a%b;while(r!=0){a=b;b=r;r=a%b;}printf("%d\n",b);//最大公约数printf("%d\n", );//最小公倍数}请分析代码逻辑,并推测划线处的代码,通过网页提交。注意:仅把缺少的代码作为答案,千万不要填写多余的代码、符号或说明文字!!参考答案:m*n/b.标题:核桃的数量小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:各组的核桃数量必须相同各组内必须能平分核桃(当然是不能打碎的)尽量提供满足1,2条件的最小数量(节约闹革命嘛)程序从标准输入读入:abca,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)程序输出:一个正整数,表示每袋核桃的数量。例如:用户输入:245程序输出:20再例如:用户输入:311程序输出:3资源约定:峰值内存消耗(含虚拟机)<64MCPU消耗<1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>#include<stdlib.h>//最小公倍数intLCM(intnum1,intnum2,intnum3){intvalue=num1;while(value%num1!=0||value%num2!=0||value%num3!=0){value+=num1;)returnvalue;)intmain()(intnum1,num2,num3;scanf("%d%d%d",&num1,&num2,&num3);printf("%d\n",LCM(num1,num2,num3));return0;).题目标题:打印十字图小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)TOC\o"1-5"\h\z$$$$$$$$$$$$$$ $$$$$$$$$$$$$$$$$ $ $ $$$$$$$$$$$$$$$$ $ $ $$$$$$$$$$$$$$$$ $ $$$$$$$$$$$$$$$$$ $ $$$$$$$$$$$$$$$$ $ $ $$$$$$$$$$$$$$$$ $ $ $$$$$$$$$$$$$$$$$ $$$$$$$$$$$$$$对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。输入格式:一个正整数n(n<30)表示要求打印图形的层数输出:对应包围层数的该标志。例如:用户输入:1程序应该输出:..$$$$$....$...$..$$$.$.$$$$,..$...$$.$$$$$.$$...$...$$$$.$.$$$..$...$....$$$$$..再例如:用户输入:3程序应该输出:..$$$$$$$$$$$$$....$ $..$$$.$$$$$$$$$.$$$$...$ $...$$.$$$.$$$$$.$$$.$$.$...$...$...$.$$.$.$$$.$.$$$.$.$$.$.$...$...$.$.$$.$.$.$$$$$.$.$.$$.$.$...$...$.$.$$.$.$$$.$.$$$.$.$$.$...$...$...$.$$.$$$.$$$$$.$$$.$$...$ $...$$$$.$$$$$$$$$.$$$..$ $....$$$$$$$$$$$$$..请仔细观察样例,尤其要注意句点的数量和输出位置。资源约定:峰值内存消耗<64MCPU消耗<1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入…”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。

10.标题:剪格子如图p1.jpg所示,3x3的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。本题的要求就是请你编程判定:对给定的mxn的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。如果无法分割,则输出0程序输入输出格式要求:程序先读入两个整数mn用空格分割(m,n<10)表示表格的宽度和高度接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。例如:用户输入:31015220301123则程序输出:3再例如:用户输入:31111130802111100则程序输出:10(参见p2.jpg)资源约定:峰值内存消耗<64MCPU消耗<5000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>#defineN10intnum[N][N];inttag[N][N]={0};intm,n;intr=100;intfind(inti,intj,intt,intntag[][N]){intcount=0;if(i<0||i>=n||j<0||j>=m||ntag[i][j]==1)return0;ntag[i][j]=1;if(tag[i][j]!=t)return0;count++;count+=find(i-1,j,t,ntag);count+=find(i+1,j,t,ntag);count+=find(i,j-1,t,ntag);count+=find(i,j+1,t,ntag);returncount;}intisbad(){inti,j,k=0,ge2;intt=tag[0][0];intntag1[N][N]={0};intntag2[N][N]={0};intge1=find(0,0,t,ntag1);for(i=0;i<n;i++){for(j=0;j<m;j++){if(tag[i][j]!=t){ k=1; break; }}if(k==1)break;}if(i==n&&j==m)return0;ge2=find(i,j,tag[i][j],ntag2);returnge1+ge2!=m*n;}intbad(inti,intj){intb;if(i<0||i>=n||j<0||j>=m||tag[i][j]==1)return1;tag[i][j]=1;b=isbad();tag[i][j]=0;returnb;}voidgo(inti,intj,intk,intcount){if(bad(i,j)||count<num[i][j])return;k++;if(count==num[i][j]){if(r>k)r=k;return;}tag[i][j]=1;count-=num[i][j];go(i-1,j,k,count);go(i+1,j,k,count);go(i,j-1,k,count);go(i,j+1,k,count);tag[i][j]=0;}intmain(){inti,j;inthalf=0;scanf("%d%d",&m,&n);for(i=0;i<n;i++)for(j=0;j<m;j++){scanf("%d",&num[i][j]);half+=num[i][j];}if(half%2==0&&half>=num[0][0]*2){half/=2; go(0,0,0,half);}if(r==100)r=0;printf("%d",r);return0;}第五届蓝桥杯软件大赛C/C++高职高专组真题标题:大衍数列中国古代文献中,曾记载过“大衍数列”,主要用于解释中国传统文化中的太极衍生原理。它的前几项是:0、2、4、8、12、18、24、32、40、50...其规律是:对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。以下的代码打印出了大衍数列的前100项。intmain(){inti;for(i=1;i<100;i++){if()〃填空i%2==0printf("%d",i*i/2);elseprintf("%d",(i*i-1)/2);}printf("\n");}请填写划线部分缺失的代码。通过浏览器提交答案。注意:不要填写题面已有的内容,也不要填写任何说明、解释文字。标题:打印图形小明在X星球的城堡中发现了如下图形和文字:rank=3**** *****rank=5***TOC\o"1-5"\h\z* ****** *** ********** ***** ****** *** ********** ****** *** ******ran=6小明开动脑筋,编写了如下的程序,实现该图形的打印。ran=6小明开动脑筋,编写了如下的程序,实现该图形的打印。#defineN70voidf(chara[][N],intrank,introw,intcol)if(rank==1){a[row][col]='*';return;intw=1;inti;for(i=0;i<rank-1;i++)w*=2;;//参考答案f(a,rank-1,row,col+w/2);f(a,rank-1,row+w/2,col);f(a,rank-1,row+w/2,col+w);}intmain(){chara[N][N];inti,j;for(i=0;i<N;i++)for(j=0;j<N;j++)a[i][j]='';f(a,6,0,0);for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%c",a[i][j]);printf("\n");}return0;}请仔细分析程序逻辑,填写缺失代码部分。通过浏览器提交答案。注意不要填写题目中已有的代码。也不要写任何多余内容(比如说明性的文字)标题:神奇算式由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。比如:210x6=12608x473=378427x81=2187都符合要求。如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。解题思路这个问题的思路也是枚举法,枚举对象分别为积和那个较小的乘数。还有两个限制条件:•每个数字的每一位数字不允许重复;•这4个数字出现且仅出现2次。这些限制条件是使用一个标记数组实现的。#include<iostream>#include<cstring>usingnamespacestd;intvis[10];intbk[10];intcheck(intx,inty){do{if(vis[x%10]==0)return0;vis[x%10]--;}while(x/=10);do{if(vis[y%10]==0)return0;vis[y%10]--;}while(y/=10);return1;}intcheck4(intx){do{if(vis[x%10]!=0)return0;vis[x%10]++;}while(x/=10);return1;}intmain(void){intcnt=0;for(inti=1023;i<=9876;i++){memset(vis,0,sizeof(vis));if(!check4(i))continue;memcpy(bk,vis,sizeof(bk));for(intj=1;j<=98;j++){memcpy(vis,bk,sizeof(bk));if(i%j!=0)continue;intk=i/j;if(j>k)continue;if(!check(j,k))continue;cout<<j<<"*"<<k<<"="<<i<<endl;cnt++;}}cout<<cnt<<endl;}所有算式最后答案128.标题:分糖果有n个小朋友围坐成一圈。老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏:每个小朋友都把自己的糖果分一半给左手边的孩子。一轮分糖后,拥有奇数颗糖的孩子由老师补给1个糖果,从而变成偶数。反复进行这个游戏,直到所有小朋友的糖果数都相同为止。你的任务是预测在已知的初始糖果情形下,老师一共需要补发多少个糖果。【格式要求】程序首先读入一个整数N(2<N<100),表示小朋友的人数。接着是一行用空格分开的N个偶数(每个偶数不大于1000,不小于2)要求程序输出一个整数,表示老师需要补发的糖果数。例如:输入3224程序应该输出:4资源约定:峰值内存消耗<256MCPU消耗<1000ms请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:main函数需要返回0注意:只使用ANSIC/ANSIC++标准,不要调用依赖于编译环境或操作系统的特殊函数。注意:所有依赖的函数必须明确地在源文件中#include<xxx>,不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。参考答案:#include<stdio.h>#include<malloc.h>intcount=0;voidf(intn,int*m){intj,temp=m[0];for(j=n-1;j>0;j--)m[(j+1)%n]+=(m[j]/=2);m[1]+=temp/2;m[0]-=temp/2;for(j=0;j<n;j++){if(m[j]%2!=0){m[j]++;count++;}}}intjisuan(intn,int*m){intj;for(j=0;j<n-1;j++)if(m[j]!=m[j+1])return0;return1;}intmain(){intn,j;scanf("%d",&n);int*m=(int*)malloc(sizeof(int)*n);for(j=0;j<n;j++)scanf("%d",&m[j]);do{f(n,m);}while(jisuan(n,m)!=1);printf("%d",count);return0;}第五届蓝桥杯软件大赛C/C++本科B组真题1.标题:啤酒和饮料啤酒每罐2.3元,饮料每罐1.9元。小明买了若干啤酒和饮料,一共花了82.3元。我们还知道他买的啤酒比饮料的数量少,请你计算他买了几罐啤酒。注意:答案是一个整数。请通过浏览器提交答案。不要书写任何多余的内容(例如:写了饮料的数量,添加说明文字等)。参考答案:#include<stdio.h>#include<math.h>intmain(){intp=23,y=19,pi,yi;for(pi=0;pi<823/23;pi++)for(yi=pi+1;yi<823/19;yi++)if(pi*p+yi*y==823)printf("pi=%d,yi=%d",pi,yi);return0;2.标题:切面条一根高筋拉面,中间切一刀,可以得到2根面条。如果先对折1次,中间切一刀,可以得到3根面条。如果连续对折2次,中间切一刀,可以得到5根面条。那么,连续对折10次,中间切一刀,会得到多少面条呢?答案是个整数,请通过浏览器提交答案。不要填写任何多余的内容。解题思路由于对折次数仅为10,数据规模并不大,可以通过手算简单的完成。对折次,得到根;对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到对折次,得到其实,上面的思路就是一种递归,可以把这种思想通过代码实现。#include<iostream>usingnamespacestd;intf2(intn,intr){if(n==0){returnr;}else{returnf2(n-1,2*r-1); }}intmain(void){cout<<f2(10,2)<<endl;return0; }标题:李白打酒话说大诗人李白,一生好饮。幸好他从不开车。一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:无事街上走,提壶去打酒。逢店加一倍,遇花喝一斗。这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。贝U:babaabbabbabbbb就是合理的次序。像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的)。注意:通过浏览器提交答案。答案是个整数。不要书写任何多余的内容。参考答案解题思路:把所有可能的排序(1、0序列)当做一个二进制的数,把所有数进行一次for循环,若能呗2整数,则为1,否则为0,每次for循环左移一位。#include<stdio.h>#include<math.h>#include<iostream>usingnamespacestd;/*李白打酒*/intmain(){inta[15];intx; //店的个数inty; //花的个数intsum;//酒的斗数intz=0;//可能结果的个数for(inti=0;i<16383;i++) //去掉第15次已经确定好的0,前面一共还有14次,即(2八14-1)=16383{sum=2;x=0;y=0;intc=i;for(intj=0;j<14;j++){if(sum<0)break;if(c%2==0){ sum--;y++; }else{ sum=sum*2;x++; }c=c>>1;// cout<<c<<endl;}if((sum==1)&&(x==5)&&(y==9)){z++;intresult=i;for(intcount=0;count<14;count++){a[count]=result%2;result=result>>1;printf("%d",a[count]); }printf("0\n");}}cout<<z<<endl;return0;}参考答案:14标题:史丰收速算史丰收速算法的革命性贡献是:从高位算起,预测进位。不需要九九表,彻底颠覆了传统手算!速算的核心基础是:1位数乘以多位数的乘法。其中,乘以7是最复杂的,就以它为例。因为,1/7是个循环小数:0.142857...,如果多位数超过142857...,就要进1同理,2/7,3/7,...6/7也都是类似的循环小数,多位数超过n/7,就要进n下面的程序模拟了史丰收速算法中乘以7的运算过程。乘以7的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位。乘以7的进位规律是:满142857...进1,满285714...进2,满428571...进3,满571428...进4,满714285...进5,

满857142...进6请分析程序流程,填写划线部分缺少的代码。//计算个位intge_wei(inta){if(a%2==0)return(a*2)%10;elsereturn(a*2+5)%10;}//计算进位intjin_wei(char*p){char*level[]={"142857","285714","428571","571428","714285","857142"};charbuf[7];buf[6]='\0';strncpy(buf,p,6);inti;for(i=5;i>=0;i--){intr=strcmp(level[i],buf);if(r<0)returni+1;while(r==0){p+=6;strncpy(buf,p,6);填空r=strcmp(level[i],buf);if(r<0)returni+1;填空参考答案}}return0;//多位数乘以7voidf(char*s){inthead=jin_wei(s);if(head>0)printf("%d",head);char*p=s;while(*p){inta=(*p-'0');intx=(ge_wei(a)+jin_wei(p+1))%10;printf("%d",x);p++;}printf("\n");}intmain(){f("428571428571");f("34553834937543");return0;}注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字)解题思路首先,要把这段代码里面涉及到的几个字符串函数弄清楚,作用如下:功能:将字符串from中至多count个字符复制到字符串to中。如果字符串from的长度小于count,其余部分用'\0'填补。返回处理完成的字符串。功能:复制字符串from中的字符到字符串to,包括空值结束符。返回值为指针to。功能:比较字符串strlandstr2,返回值为strl-str2的值。然后,一步一步的读代码就可以了。题目中给出的两个测试数据的运算结果分别为标题:奇怪的分式上小学的时候,小明经常自己发明新算法。一次,老师出的题目是:1/4乘以8/5小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45(参见图l.png)'x工=卫4 5 45直接去拼接分子、分母也M以完成「算?老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼!对于分子、分母都是1~9中的一位数的情况,还有哪些算式可以这样计算呢?请写出所有不同算式的个数(包括题中举例的)。显然,交换分子分母后,例如:4/1乘以5/8是满足要求的,这算做不同的算式。但对于分子分母相同的情况,2/2乘以3/3这样的类型太多了,不在计数之列!注意:答案是个整数(考虑对称性,肯定是偶数)。请通过浏览器提交。不要书写多余的内容。#include<iostream>#include<cmath>#include<cstdio>usingnamespacestd;#defineeps10e-10intmain(){intans=0;for(inti=1;i<10;++i){for(intj=1;j<10;++j){for(intr=1;r<10;++r){for(intk=1;k<10;k++){if(i==j||r==k)continue;if(fabs((i*10+r)*1.0/(j*10+k)-(i*r*1.0)/(j*k))<eps){//printf("%d/%d:%d/%d\n",(i*10+r),(j*10+k),i*r,(j*k));ans++;}}}}}cout<<ans<<endl;return0;}答案:14(标题:六角填数如图【l.png】所示六角形中,填入1~12的数字。使得每条直线上的数字之和都相同。图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少?请通过浏览器提交答案,不要填写多余的内容。参考答案:#include<iostream>#include<cmath>#include<cstdio>#include<cstring>usingnamespacestd;#defineeps10e-10#defineN15inta[N];boolvis[N];voiddfs(intx){if(x==1||x==2||x==12){dfs(x+1);return;}if(x>12){intt[6];t[0] = a[1] + a[3] + a[6] + a[8];t[1] = a[1] + a[4] + a[7] + a[11];t[2] = a[2] + a[3] + a[4] + a[5];t[3] = a[2] + a[6] + a[9] + a[12];t[4]=a[8]+a[9]+a[10]+a[11];t[5]=a[12]+a[10]+a[7]+a[5];for(inti=1;i<6;++i)if(t[i]!=t[i-1])return;cout<<a[6]<<endl;return;for(inti=1;i<13;++i){if(!vis[i]){vis[i]=1;a[x]=i; dfs(x+1);vis[i]=0; }}}intmain(){memset(vis,0,sizeof(vis));vis[1]=1;a[1]=1;vis[8]=1;a[2]=8;vis[3]=1;a[12]=3;dfs(1);return0;}答案:10每条直线上面的和为26标题:蚂蚁感冒长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。【数据格式】第一行输入一个整数n(1<n<50),表示蚂蚁的总数。接着的一行是n个用空格分开的整数Xi(-100<Xi<100),Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。要求输出1个整数,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论