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;



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