2014年蓝桥杯c语言试题及答案发布时间:2015-04-091.标题:马虎的算式小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。有一次,老师出的题目是:36x495=?他却给抄成了:396x45=?但结果却很戏剧性,他的答案竟然是对的!!因为36*495=396*45=17820类似这样的巧合情况可能还有很多,比如:27*594=297*54假设abcde代表1~9不同的5个数字(注意是各不相同的数字,且不含0)能满足形如:ab*cde=adb*ce这样的算式一共有多少种呢?请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。答案直接通过浏览器提交。注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。答案:1422.标题:振兴中华小明参加了学校的趣味运动会,其中的一个项目是:跳格子。地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)从我做起振我做起振兴做起振兴中起振兴中华比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。请你帮助小明算一算他一共有多少种可能的跳跃路线呢?答案是一个整数,请通过浏览器直接提交该数字。答案:353.题目标题:猜年龄美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你推算一下,他当时到底有多年轻。通过浏览器,直接提交他那时的年龄数字。注意:不要提交解答过程,或其它的说明文字。答案:184.标题:幻方填空幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。他把1,2,3,...16这16个数字填写在4x4的方格中。如图p1.jpg所示,即:16??13??11?9??*?15?1表中有些数字已经显露出来,还有些用?和*代替。请你计算出?和*所代表的数字。并把*所代表的数字作为本题答案提交。答案是一个整数,请通过浏览器直接提交该数字。答案:125.题目标题:公约数公倍数我们经常会用到求两个整数的最大公约数和最小公倍数的功能。下面的程序给出了一种算法。函数myfunc接受两个正整数a,b经过运算后打印出它们的最大公约数和最小公倍数。此时,调用myfunc(15,20)将会输出:360//交换数值voidswap(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;}voidmyfunc(inta,intb){intm,n,r;if(am=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/b6.标题:三部排序一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,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{__________________________;//填空位置}}}如果给定数组: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请分析代码逻辑,并推测划线处的代码,通过网页提交答案:p++7.标题:核桃的数量小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:1.各组的核桃数量必须相同2.各组内必须能平分核桃(当然是不能打碎的)3.尽量提供满足1,2条件的最小数量(节约闹革命嘛)程序从标准输入读入:abca,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c30)程序输出:一个正整数,表示每袋核桃的数量。例如:用户输入:245程序输出:20再例如:用户输入:311程序输出:3#includevoidswap(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;}intf(inta,intb){intm,n,r;if(am=a,n=b,r=a%b;while(r!=0){a=b;b=r;r=a%b;}returnm*n/b;}intmain(){inta,b,c;scanf(%d%d%d,&a,&b,&c);printf(%d,f(f(a,b),f(b,c)));return0;}8.题目标题:打印十字图小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。输入格式:一个正整数n(n30)表示要求打印图形的层数输出:对应包围层数的该标志。例如:用户输入:1程序应该输出:..$$$$$....$...$..$$$.$.$$$$...$...$$.$$$$$.$$...$...$$$$.$.$$$..$...$....$$$$$..再例如:用户输入:3程序应该输出:..$$$$$$$$$$$$$....$...........$..$$$.$$$$$$$$$.$$$$...$.......$...$$.$$$.$$$$$.$$$.$$.$...$...$...$.$$.$.$$$.$.$$$.$.$$.$.$...$...$.$.$$.$.$.$$$$$.$.$.$$.$.$...$...$.$.$$.$.$$$.$.$$$.$.$$.$...$...$...$.$$.$$$.$$$$$.$$$.$$...$.......$...$$$$.$$$$$$$$$.$$$..$...........$....$$$$$$$$$$$$$..请仔细观察样例,尤其要注意句点的数量和输出位置。#includevoidswap(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;}intgo(inti,intj,intn){if(in*2+3)i=n*4+6-i;if(jn*2+3)j=n*4+6-j;if(ij)swap(&i,&j);if(i=2&&j=2)return0;if(i%2==1&&j=i-2)return1;if(j%2==1&&j!=i-1)return1;return0;}intmain(){intn;scanf(%d,&n);inti,j;for(i=1;i=n*4+5;i++){for(j=1;j=n*4+5;j++){if(go(i,j,n))printf($);elseprintf(.);}printf(\n);}return0;}9.标题:带分数100可以表示为带分数的形式:100=3+69258/714还可以表示为:100=82+3546/197注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。类似这样的带分数,100有11种表示法。题目要求:从标准输入读入一个正整数N(N1000*1000)程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。注意:不要求输出每个表示,只统计有多少表示法!例如:用户输入:100程序输出:11再例如:用户输入:105程序输出:6#include#defineN9intnum[N]={1,2,3,4,5,6,7,8,9};inttag[3][3]={{4,3,2},{5,3,1},{6,2,1}};voidswap(int*a,int*b){inttemp;temp=*a;*a=*b;*b=temp;}intgo(inti,intn){inta,b,c;intcount=0;for(a=0;a3;a++){intr[3]={0},d=0;for(b=0;b3;b++)for(c=0;ctag[a][b];c++)r[b]=r[b]*10+num[d++];if(r[0]+r[1]/r[2]==n&&r[1]%r[2]==0)count++;if(r[0]+r[2]/r[1]==n&&r[2]%r[1]==0)count++;if(r[1]+r[0]/r[2]==n&&r[0]%r[2]==0)count++;if(r[1]+r[2]/r[0]==n&&r[2]%r[0]==0)count++;if(r[2]+r[0]/r[1]==n&&r[0]%r[1]==0)count++;if(r[2]+r[1]/r[0]==n&&r[1]%r[0]==0)count++;}while(iN){intk=i+1;while(kN){swap(num+i,num+k);count+=go(i+1,n);swap(num+i,num+k);k++;}i++;}returncount;}intmain(){intn;scanf(%d,&n);printf(%d,go(0,n));return0;}10.标题:剪格子如图p1.jpg所示,3x3的格子中填写了一些整数。我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。本题的要求就是请你编程判定:对给定的mxn的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。如果无法分割,则输出0程序输入输出格式要求:程序先读入两个整数mn用空格分割(m,n10)表示表格的宽度和高度接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。例如:用户输入:331015220301123则程序输出:3再例如:用户输入:431111130802111100则程序输出:10#include#defineN10intnum[N][N];inttag[N][N]={0};intm,n;intr=100;intfind(inti,intj,intt,intntag[][N]){intcount=0;if(i0||i=n||j0||j=m||ntag[i][j]==1)return0;ntag