2015 蓝桥杯

1.奖券数目

有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利。
虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求。某抽奖活动的奖券号码是5位数(10000-99999),要求其中不要出现带“4”的号码,主办单位请你计算一下,如果任何两张奖券不重号,最多可发出奖券多少张。
请提交该数字(一个整数),不要写任何多余的内容或说明性文字。编程思想:暴力或推公式。

#include"stdio.h"
int main()
{
 long long int   a,b=0;
 int ge ,shi ,bai,qian,wan;
 for(a=10000;a<=99999;a++) 
{
ge =a% 10;
shi=a/10%10;
bai=a/100%10;
qian=a/1000% 10; 
wan =a/10000%10 ;
   if(ge!=4&&shi!=4&&bai!=4&&qian!=4&&wan!=4)
   {
    b++;
   
}


}
printf("%lld",b);
return 0;
}

小于等于9999 写成小于会得错误答案,要小心。

2、星系炸弹
X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。


请填写该日期,格式为 yyyy-mm-dd  即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。手算。




3.

.

#include"stdio.h"
int main()
{
int a,b,c,d,e,f,g,h;
for (a=1;a<10;a++)
{

for (b=0;b<10;b++)
{
for(c=0;c<10;c++)
{
for(d=0;d<10;d++)
{
for(e=1;e<10;e++)
{
for(f=0;f<10;f++)
{
for(g=0;g<10;g++)
{    



             // if (a==b||a==c||a==d||a==e||a==f||a==g||b==c||b==d||b==e||b==f||b==g||c==d||c==e||c==f||c==g||d==e||d==f||d==g||e==f||e==g||f==g)
 // break;
int sum;
int ge,shi,bai,qian,wan;
sum=a*1000+b*100+c*10+d+e*1000+f*100+g*10+b;
ge =sum%10;
shi=sum/10%10;
bai =sum/100%10;
qian= sum/1000%10;
wan =sum/10000%10;
if((e==wan)&&(f==qian)&&(c==bai)&&(b==shi))
{   if(a!=b&&a!=c&&a!=d&&a!=e&a!=f&&a!=f&&a!=g&&b!=c&&b!=d&&b!=d&&b!=e&&b!=f&&b!=g&&c!=d&&c!=e&&c!=f&&c!=g&&d!=e&&d!=f&&d!=g&&e!=f&&e!=g&&f!=g)

{
if (ge!=a&&ge!=b&&ge!=c&&ge!=d&&ge!=e&&ge!=f&&ge!=g)
{
// printf("%d %d %d %d\n ",a,b,c,d);
printf("%d %d %d %d\n ",e,f,g,b);
// printf("sum = %d\n ",sum);;


}
}
}


}
}
}

}

}

}

}
return 0;
}

答案 :1085

暴力解决

4.

StringInGrid函数会在一个指定大小的格子中打印指定的字符串。
要求字符串在水平、垂直两个方向上都居中。
如果字符串太长,就截断。
如果不能恰好居中,可以稍稍偏左或者偏上一点。


下面的程序实现这个逻辑,请填写划线部分缺少的代码。

#include <stdio.h>
#include <string.h>
void StringInGrid(int width, int height, const char* s)
{
int i,k;
char buf[1000];
strcpy(buf, s);
if(strlen(s)>width-2) buf[width-2]=0;


printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");


for(k=1; k<(height-1)/2;k++){
printf("|");
for(i=0;i<width-2;i++) printf(" ");
printf("|\n");
}


printf("|");


printf("%*s%s%*s",(width-strlen(buf)-2)/2," ",buf,(width-strlen(buf)-2)/2+(width-strlen(buf)-2)%2+(width-strlen(buf)-2)," ");  //填空
         
printf("|\n");


for(k=(height-1)/2+1; k<height-1; k++){
printf("|");
for(i=0;i<width-2;i++) printf(" ");
printf("|\n");



printf("+");
for(i=0;i<width-2;i++) printf("-");
printf("+\n");
}


int main()
{
StringInGrid(20,6,"abcd1234");
return 0;
}


所以填的那句是在左半部分剩余地方补空格,右半部分空余区补空格。





6、加法变乘法


我们都知道:1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015


比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案。


请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。


注意:需要你提交的是一个整数,不要填写任何多余的内容。

#include"stdio.h"
int main()
{  int i;
   int sum1,sum2,sum3,a,b,j;
for  (a=1;a<48;a++) //第一断点a 第二个断点b 
      {  
      sum1=0;  
 for(j=1;j<a;j++)
  {
sum1=sum1+j;

  }
  sum1+=a*(a+1);
 //printf("断点1=%d,sum1=%d\n",a,sum1); 
 for (b=a+1;b<=48;b++)
 {     sum2=0;
       sum3=0;
   for (j=a+2;j<b;j++)
   {
    sum2+=j;
}
  sum2+=b*(b+1) ;
  // printf("断点2=%d,sum2=%d\n",a,sum2);
  for (j=b+2;j<50;j++)
   {
    sum3=sum3+j;
   }  
   // printf("sum3=%d\n",a,sum3);
  if((sum1+sum2+sum3)==2015)
      printf("断点1=%d 断点2=%d\n",a,b);
     }
}
  

return 0;
}

答案 :10 16

第二种暴力 

#include"stdio.h"

int main()
{
 


     
     int i,j,k;
     int sum;
for (i=1;i<49;i++)

for (j=i+2;j<49;j++)
{  sum =0;
for ( k=0;k<i;k++)
{
sum=sum+k;  
}
sum=sum+k*(k+1);
for ( k=i+2;k <j;k++)
{
sum=sum+k;
}
 sum=sum+k*(k+1);
 for ( k=j+2;k<=49 ;k++ )
 {
   sum=sum+k;
 }
  if (sum ==2015)
  printf("%d %d\n", i,j);
  
  }

}

return 0;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章