2013蓝桥杯题解c组C++

01 猜年龄

题目描述:
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
“我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻。

解题思路:

根据题意选取可能的年龄范围(可选取[10, 100]),使用一层循环一次枚举,找到符合要求的解即可。注意对数位的分离、位数判定、排序等操作

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
   
	int i,j;
	int n1,n2;    //n1.n2分别保存i^3与i^4
	int digit[10],len;    //digit保存n1.n2中的各数位 len记录位数
	int suc;      //suc标记i是否符合要求 
	for(i=10;i<=100;i++)  //枚举年龄i 
	{
   
		n1=i*i*i;         
		n2=i*i*i*i;
		len=0; 
		while(n1)
		{
   
			digit[len++]=n1%10;
			n1/=10;
		}
		if(len==4)   //n1是4位数,继续 
		{
   
			while(n2)
			{
   
				digit[len++]=n2%10;
				n2/=10;
			}
			if(len==10)   //n2是6位数,继续 
			{
   
				sort(digit,digit+len);  //0,1,2,...,9 
				suc=1;
				for(j=0;j<len;j++) 
				{
   
					if(digit[j]!=j)
					{
   
						suc=0;
						break;
					}
				}
				if(suc==1)   //符合要求,输出 
					printf("%d %d %d\n",i,i*i*i,i*i*i*i);
			}
		}
	}
	return 0;
}

运行结果:

18 5832 104976

答案:

18

02 马虎的算式

题目描述:
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是: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 这样的算式一共有多少种呢?

请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。

代码:

#include <stdio.h>
int main()
{
   
    int a,b,c,d,e,n;
    n=0;
    for (a=1;a<10;a++)
    for (b=1;b<10;b++)
       {
    
        if (a==b) continue;
             else 
                for (c=1;c<10;c++)
               {
     
               if((c==a)||(c==b)) continue;
                      else 
                         for (d=1;d<10;d++)
                       {
    
                           if((d==a) || (d==b) || (d==c)) continue ;
                              else
                                  for (e=1;e<10;e++)
                                   {
    
                                   if ((e==a)||(e==b)||(e==c)||(e==d)) continue;
                                         else if ( (10*a+b)*(100*c+10*d+e)==(100*a+10*d+b)*(10*c+e)) 
                                             n++;
                                    }
                       }
               }
       }
 
    printf("%d\n",n);
    return 0;
}

运行结果:

142

03 振兴中华

题目描述
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。

解题思路:

把每个格子都换成一个数字,从0算起,这样,题目就变成了从0格跳到第7格的路线数目

代码:

#include <stdio.h>
int a[4][5];
int sum;
void dfs(int row,int col,int index)
{
   
	//if(a[row][col]!=index)  这两句话其实没必要,感谢 hzylmf 提的意见 
	//	return ;
	if(a[row][col]==index && index==7)
		sum++;
	else {
   
		if(row+1<4)
				dfs(row+1,col,index+1);
		if(col+1<5)
				dfs(row,col+1,index+1);
	}
}
int main()
{
   
	int row,col;
	for(row=0;row<4;row++)
		for(col=0;col<5;col++)
			a[row][col]=row+col;
 
	dfs(0,0,0);
	printf("sum = %d\n",sum);
 
	return 0;
}

运行结果:

35

04 幻方填空

题目描述:
幻方是把一些数字填写在方阵中,使得行、列、两条对角线的数字之和都相等。
欧洲最著名的幻方是德国数学家、画家迪勒创作的版画《忧郁》中给出的一个4阶幻方。
他把1,2,3,…16 这16个数字填写在4 x 4的方格中。
如图所示,即:

16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
表中有些数字已经显露出来,还有些用?和*代替。
请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答案提交。

答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。

解题思路:

搜索(dfs)+剪枝
可以使用一个二维数组保存该幻方(预先没有填数的位置(包括?和*)为0),然后从第一个“0”开始(位置(0, 1))搜索,依次试探2~16 15个数(因为1已经预先填入幻方)。找到符合要求的解。

注意标记及剪枝(这里使用了行剪枝,当搜索到第二行时,用flag记录第一行4个数的和,后面若发现某行4个数之和不等于flag,则该方案不符合要求),以提高程序效率。

代码:

#include <stdio.h>
#include <string.h>
#define maxn 20
int mat[4][4]=<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值