2013第四届“蓝桥杯”CC++程序设计高职高专组试题及部分答案

1. 题目标题: 猜年龄

    美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。

    一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:

    “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”

    请你推算一下,他当时到底有多年轻。

    通过浏览器,直接提交他那时的年龄数字。
    注意:不要提交解答过程,或其它的说明文字。

答案:18
2. 标题: 马虎的算式

    小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。

    有一次,老师出的题目是:36 x 495 = ?

    他却给抄成了:396 x 45 = ?

    但结果却很戏剧性,他的答案竟然是对的!!

    因为 36 * 495 = 396 * 45 = 17820

    类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54

    假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)

    能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。

满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。

答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。

答案:142

3. 标题: 振兴中华

    小明参加了学校的趣味运动会,其中的一个项目是:跳格子。

    地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
从我做起振
我做起振兴
做起振兴中
起振兴中华

    比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。

    要求跳过的路线刚好构成“从我做起振兴中华”这句话。

    请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

答案是一个整数,请通过浏览器直接提交该数字。
 杨辉三角

答案:35
4. 标题: 幻方填空

    幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。

    欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。

    他把1,2,3,...16 这16个数字填写在4 x 4的方格中。

    如图p1.jpg所示,即:
16 ?  ?  13              
?  ?  11 ?              
9  ?  ?  *	
?  15 ?  1                    

    表中有些数字已经显露出来,还有些用?和*代替。

    请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。

答案是一个整数,请通过浏览器直接提交该数字。


答案:12
5. 题目标题:公约数公倍数

    我们经常会用到求两个整数的最大公约数和最小公倍数的功能。

    下面的程序给出了一种算法。

    函数 myfunc 接受两个正整数a,b

    经过运算后打印出 它们的最大公约数和最小公倍数。

    此时,调用 myfunc(15,20)  

将会输出:
3
60 


// 交换数值
void swap(int *a,int *b)
{
   int temp;
   temp=*a;
   *a=*b;
   *b=temp;
}


void myfunc(int a, int b)
{
   int m,n,r;  
   if(a答案: m*n/b
6.标题:三部排序

    一般的排序有许多经典算法,如快速排序、希尔排序等。

    但实际应用时,经常会或多或少有一些特殊的要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。

    比如,对一个整型数组中的数字进行分类排序:

    使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!!

    以下的程序实现了该目标。

    其中x指向待排序的整型数组,len是数组的长度。

void sort3p(int* x, int len)
{
    int p = 0;
    int left = 0;
    int right = len-1;
    
    while(p<=right){
        if(x[p]<0){
            int t = x[left];
            x[left] = x[p];
            x[p] = t;
            left++;
            p++;
        }
        else if(x[p]>0){
            int t = 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条件的最小数量(节约闹革命嘛)

程序从标准输入读入:
a b c
a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)

程序输出:
一个正整数,表示每袋核桃的数量。

例如:
用户输入:
2 4 5

程序输出:
20

再例如:
用户输入:
3 1 1

程序输出:
3

8. 题目标题:打印十字图

    小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)
                     $$$$$$$$$$$$$
                     $           $
                   $$$ $$$$$$$$$ $$$
                   $   $       $   $
                   $ $$$ $$$$$ $$$ $
                   $ $   $   $   $ $
                   $ $ $$$ $ $$$ $ $
                   $ $ $   $   $ $ $
                   $ $ $ $$$$$ $ $ $
                   $ $ $   $   $ $ $
                   $ $ $$$ $ $$$ $ $
                   $ $   $   $   $ $
                   $ $$$ $$$$$ $$$ $
                   $   $       $   $
                   $$$ $$$$$$$$$ $$$
                     $           $
                     $$$$$$$$$$$$$

    对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
    
    为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。

输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数

输出:
对应包围层数的该标志。

例如:
用户输入:
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..


再例如:
用户输入:
3
程序应该输出:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

请仔细观察样例,尤其要注意句点的数量和输出位置。
 
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

10. 标题:剪格子

    如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
    我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。

    本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
    如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。   
    如果无法分割,则输出 0

程序输入输出格式要求:

程序先读入两个整数 m n 用空格分割 (m,n<10)
表示表格的宽度和高度
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000
程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。

例如:
用户输入:
3 3
10 1 52
20 30 1
1 2 3

则程序输出:
3

再例如:
用户输入:
4 3
1 1 1 1
1 30 80 2
1 1 1 100

则程序输出:
10
以下是本人的一些解答过程:
 
  
第2题代码实现:
 
  
#include 
#include 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	int i=0;
	int a,b,c,d,e;
	for(a=1;a<10;a++)
	{
		for(b=1;b<10;b++)
		{
			for(c=1;c<10;c++)
			{
				for(d=1;d<10;d++)
				{
					for(e=1;e<10;e++)
					{
						if((a==b||a==c||a==d||a==e) || (b==c||b==d||b==e) || (c==d||c==e) || d==e)
							continue;
						else if((a*10+b)*(c*100+d*10+e) == (a*100+d*10+b)*(c*10+e))
							i++;
					}
				}
			}
		}
	}
	printf("%d",i);
	return 0;
}


第3题思路:
杨辉三角
第4题代码实现:
 
  
#include 
#define sum 34 //(1+16)*16/4 = 34

int main()
{
	
	int i1,i2,i3,i4,i5,i6,i7,i8,i9,i10;
	int x;
	//元素待确定:2, 3, 4, 5, 6, 7, 8, 10, 12, 14
	int temp[10] = {2, 3, 4, 5, 6, 7, 8, 10, 12, 14};
	//4*4方阵如下
	int arr[16] = {16, 0, 0, 13, 
					0, 0, 11, 0,
					9, 0, 0, 0,
					0, 15, 0, 1};
	for (i1=0;i1<10;i1++)
	{
		arr[1] = temp[i1];
		for(i2=0;i2<10;i2++)
		{
			arr[2] = temp[i2];
			for(i3=0;i3<10;i3++)
			{
				arr[4] = temp[i3];
				for(i4=0;i4<10;i4++)
				{
					arr[5] = temp[i4];
					for(i5=0;i5<10;i5++)
					{
						arr[7] = temp[i5];
						for(i6=0;i6<10;i6++)
						{
							arr[9] = temp[i6];
							for(i7=0;i7<10;i7++)
							{
								arr[10] = temp[i7];
								for(i8=0;i8<10;i8++)
								{
									arr[11] = temp[i8];
									for(i9=0;i9<10;i9++)
									{
										arr[12] = temp[i9];
										for(i10=0;i10<10;i10++)
										{
											arr[14] = temp[i10];

											if(arr[1] == arr[2] ||
												arr[1] == arr[4] ||
												arr[1] == arr[5] ||
												arr[1] == arr[7] ||
												arr[1] == arr[9] ||
												arr[1] == arr[10] ||
												arr[1] == arr[11] ||
												arr[1] == arr[12] ||
												arr[1] == arr[14] ||
												arr[2] == arr[4] ||
												arr[2] == arr[5] ||
												arr[2] == arr[7] ||
												arr[2] == arr[9] ||
												arr[2] == arr[10] ||
												arr[2] == arr[11] ||
												arr[2] == arr[12] ||
												arr[2] == arr[14] ||
												arr[4] == arr[5] ||
												arr[4] == arr[7] ||
												arr[4] == arr[9] ||
												arr[4] == arr[10] ||
												arr[4] == arr[11] ||
												arr[4] == arr[12] ||
												arr[4] == arr[14] ||
												arr[5] == arr[7] ||
												arr[5] == arr[9] ||
												arr[5] == arr[10] ||
												arr[5] == arr[11] ||
												arr[5] == arr[12] ||
												arr[5] == arr[14] ||
												arr[7] == arr[9] ||
												arr[7] == arr[10] ||
												arr[7] == arr[11] ||
												arr[7] == arr[12] ||
												arr[7] == arr[14] ||
												arr[9] == arr[10] ||
												arr[9] == arr[11] ||
												arr[9] == arr[12] ||
												arr[9] == arr[14] ||
												arr[10] == arr[11] ||
												arr[10] == arr[12] ||
												arr[10] == arr[14] ||
												arr[11] == arr[12] ||
												arr[11] == arr[14] ||
												arr[12] == arr[14])
											{
												continue;
											}else if(sum == (arr[0]+arr[4]+arr[8]+arr[12]) &&	//列
													sum == (arr[1]+arr[5]+arr[9]+arr[13]) &&
													sum == (arr[2]+arr[6]+arr[10]+arr[14]) &&
													sum == (arr[3]+arr[7]+arr[11]+arr[15]) &&
													
													sum == (arr[0]+arr[1]+arr[2]+arr[3]) &&		//行
													sum == (arr[4]+arr[5]+arr[6]+arr[7]) &&
													sum == (arr[8]+arr[9]+arr[10]+arr[11]) &&
													sum == (arr[12]+arr[13]+arr[14]+arr[15]) &&

													sum == (arr[0]+arr[5]+arr[10]+arr[15]) &&	//对角线
													sum == (arr[3]+arr[6]+arr[9]+arr[12]))
											{
												for (x=0;x<16;x++)
												{
													if(x%4 == 0)
														printf("\n");
													printf("%d\t", arr[x]);
												}
												printf("答案是:%d\n",arr[11]);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		
	}
	printf("穷举完毕!!!\n");
	return 0;
}


以上代码质量不太好及解题思路并不太完善,渴望与大家交流经验。。。如有错误欢迎指正!
 
  
 
  
 
  
 
  
 
 

你可能感兴趣的:(C,蓝桥杯)