2012 蓝桥杯

本文通过编程方式解决了一系列有趣的数学谜题,包括寻找特定数字组合、推断海盗饮酒人数变化及比赛得分模式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.古堡算式
福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:
ABCDE * ? = EDCBA
他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!”
华生:“我猜也是!”
于是,两人沉默了好久,还是没有算出合适的结果来。
请你利用计算机的优势,找到破解的答案。
把 ABCDE 所代表的数字写出来。
思路:循环遍历每个字母可能的情况。

答案:21978

#include"stdio.h"

int main()
{

int k=0;
 int a,b,c,d,e,f;
 for (a=0;a<=9;a++) //a,b,c,d,e;5个不同的数  
 {
  for (b=0;b<=9;b++)
  {
 
  for(c=0;c<=9;c++)
  {
  for (d=0;d<=9;d++)
  {  for (e=0;e<=9;e++)
     {  
       if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e )
  {  for(f=1;f<10;f++)
      if ((a* 10000+b*1000+c*100+d*10+e)*f==(e*10000+ d*1000+ c*100+ b*10 +a))
      {
     
     
   printf("%d%d%d%d%d\n",a,b,c,d,e);
  }
            
    }
}
 
}
 
}
 
 }
}


return 0;
}

海盗比酒量

有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“......昨天,我正好喝了一瓶.......奉劝大家,开船不喝酒,喝酒别开船......”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,...
例如,有一种可能是:20,5,4,2,0
思路:4次之后船长喝了1瓶,每一次喝的量都是一个分数,4次之和为1

答案:12, 6, 4, 2, 0
           15, 10, 3, 2, 0
           18, 9, 3, 2, 0

#include"stdio.h"
int main()
{   int m,n,j,k;
   for (m=1;m<20;m++)
   {
   
    for (n=1;n<m;n++)
    {
   
    for(j=1;j<n;j++)
    {
   
    for (k=1;k<j;k++)
    {
   
   
    if (m*j*k+n*j*k+n*m*k+n*m*j==n*m*j*k)
   
    {
    printf("%d %d %d %d %d\n",m,n,j,k,0);
}
   
}
   
}
   
}
   
   }


return 0;
}


第四题某电视台举办了低碳生活大奖赛。题目的计分规则相当奇怪:
 每位选手需要回答10个问题(其编号为1到10),越后面越有难度。答对的,
 当前分数翻倍;答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错误处理)。  
  每位选手都有一个起步的分数为10分。某获胜选手最终得分刚好是100分,如果不让你看比赛过程
  ,你能推断出他(她)哪个题目答对了,哪个题目答错了吗? 如果把答对的记为1,答错的记为0
  ,则10个题目的回答情况可以用仅含有1和0的串来表示。例如:0010110011 就是可能的情况。
你的任务是算出所有可能情况。每个答案占一行。答案写在“解答.txt”中,不要写在这里!
#include"stdio.h"
int main()
{
int a,b,c,d,e,f,g,h,i,j;

for (a=0;a<=1;a++)
{
for(b=0;b<=1;b++)
{

for (c=0;c<=1;c++)
{
for (d=0;d<=1;d++)
{
for(e=0;e<=1;e++)
{
for(f=0;f<=1;f++)
{
for(g=0;g<=1;g++)
{
for(h=0;h<=1;h++)
{
for(i=0;i<=1;i++)
{
for(j=0;j<=1;j++)
{  int score;
   score =10;
   if(a==0)
   {
    score=score-1;
}
else 
score=score*2;
if(b==0)
   {
    score=score-2;
}
else 
score=score*2;
if(c==0)
   {
    score=score-3;
}
else 
score=score*2;
if(d==0)
   {
    score=score-4;
}
else 
score=score*2;
if(e==0)
   {
    score=score-5;
}
else 
score=score*2;
if(f==0)
   {
    score=score-6;
}
else 
score=score*2;
 if(g==0)
   {
    score=score-7;
}
else 
score=score*2;
if(h==0)
   {
    score=score-8;
}
else 
score=score*2;
if(i==0)
   {
    score=score-9;
}
else 
score=score*2;
if(j==0)
   {
    score=score-10;
}
else 
score=score*2;
  if (score==100)
  {
  printf("%d%d%d%d%d%d%d%d%d%d\n",a,b,c,d,e,f,g,h,i,j);
  }
}
}
}
}
}
}
}
}
}

}
return 0;
}

第五题

对一个方阵转置,就是把原来的行号变列号,原来的列号变行号例如,如下的方阵:

1 2  3  4

 5 6  7  8

 9 1011 12

13 14 15 16

转置后变为:

1 5  9 13

 2  6 1014

 3  7 1115

 4  8 1216

 但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:

 13 9  5  1

14 10 6  2

15 11 7  3

16 12 8  4

 下面的代码实现的功能就是要把一个方阵顺时针旋转。

void rotate(int* x, int rank)

{

int*y = (int*)malloc(___________________); // 填空

for(inti=0; i<rank * rank; i++)

y[_________________________]= x[i];  // 填空

}

for(i=0;i<rank*rank; i++)

x[i]= y[i];

free(y);

}

 int main(int argc, char* argv[])

intx[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

intrank = 4;

  rotate(&x[0][0],rank);

 for(inti=0; i<rank; i++)

         {

                   for(intj=0; j<rank; j++)

                   {

                            printf("%4d",x[i][j]);

                   }

                   printf("\n");

         }

 

         return0;

}

 

 

 

请分析代码逻辑,并推测划线处的代码。

 

答案写在 “解答.txt” 文件中

 

注意:只写划线处应该填的内容,划线前后的内容不要抄写。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值