2015年第六届C/C++B组蓝桥杯省赛真题
程序员文章站
2022-07-15 09:05:41
...
第六届C/C++B组蓝桥杯省赛真题地址
https://www.lanqiao.cn/courses/2786/learning/?id=67083
第一题 奖券数目
//直接暴力
#include<iostream>
using namespace std;
int main(){
int sum = 0;
for(int i=1; i<=9; i++){
if(i!=4)
for(int j=0; j<=9; j++){
if(j!=4)
for(int x=0; x<=9; x++){
if(x!=4){
for(int y=0; y<=9; y++){
if(y!=4){
for(int z=0; z<=9; z++){
if(z!=4)
sum++;
}
}
}
}
}
}
}
cout<<sum<<endl;
return 0;
}
题目答案
52488
第二题 星系炸弹
知识补充:
(1)闰年的判断:
①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)
②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)
(2)闰年366天,平年365天
//也可以直接手算
#include<iostream>
using namespace std;
bool run_year(int year){
if(year%400==0)
{
return true;
}
if(year%100!=0 && year%4==0)
{
return true;
}
return false;
}
int main(){
//便于计算,从2015年1月1日开始
int year = 2015;
int ndays = 1000-21-31;
int yearday = 0;
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
while(1){
if(run_year(year))
yearday = 366;
else
yearday = 365;
if(ndays<yearday)
break;
else
{
ndays -= yearday;
year++;
}
}
if(run_year(year))
month[2] = 29;
while(1){
for(int i=1; i<13; i++){
if(ndays < month[i]){
cout<<year;
if(ndays<10)
cout<<"-0"<<i;
else
cout<<"-"<<i;
if(ndays<10)
cout<<"-0"<<ndays<<endl;
else
cout<<"-"<<ndays<<endl;
return 0;
}
ndays -= month[i];
}
}
return 0;
}
题目答案
2017-08-05
第三题 三羊献瑞
由题意可以得知:祥和三不为0,且三为1
直接用next_permutation()进行全排列知识补充:next_permutation()函数 https://blog.csdn.net/qq_44619675/article/details/115277991
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int num[9] = {0,2,3,4,5,6,7,8,9};
//num[0] ~ num[6] 为祥 瑞 生 辉 羊 献 气
do{
if(num[0]!=0){
int a = num[0]*1000 + num[1]*100 + num[2]*10 + num[3];
int b = 1*1000 + num[4]*100 + num[5]*10 + num[1];
int c = 1*10000 + num[4]*1000 + num[2]*100 + num[1]*10 +num[6];
if(a+b == c){
cout<<"1"<<num[4]<<num[5]<<num[1]<<endl;
break;
}
}
}while(next_permutation(num,num+9));
return 0;
}
题目答案
1085
第四题 格子输出
知识补充
printf("%*s",7,“a”)相当于printf("%7s",“a”)
#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-2-strlen(s))/2," ",s,(width-2-strlen(s))/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;
}
题目答案
(width-2-strlen(s))/2," ",s,(width-2-strlen(s))/2," "
第五题 九数组分数
#include <stdio.h>
void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
if(a*3==b) printf("%d / %d\n", a, b);
}
void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}
for(i=k; i<9; i++){
{ t=x[k];x[k]=x[i];x[i]=t;
}
f(x,k+1);
//_____________________________________________ // 填空处
{ t=x[k];x[k]=x[i];x[i]=t;}//填空答案
}
}
int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}
题目答案
{ t=x[k];x[k]=x[i];x[i]=t;}
第六题 加法变乘法
#include<iostream>
using namespace std;
int main(){
//第一个*
for(int i=1; i<50; i++)
{
//第二个*
for(int j = i+2; j<50; j++)
{
int sum = 0;
for(int k=1; k<50; k++)
{
if(k==i || k==j){
sum += k*(k+1);
k++;
}
else
sum += k;
}
if(sum==2015)
cout<<i<<endl;
}
}
return 0;
}
题目答案(输出结果中只有10,16)
16