欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
待练习补充…
相关标签: 蓝桥杯 c++