天天看点

第六届蓝桥杯大赛个人赛省赛C/C++A组答案(除编程题)

1.方程整数解

方程: a^2 + b^2 + c^2 = 1000
(或参见【图1.jpg】)
这个方程有整数解吗?有:a,b,c=6,8,30 就是一组解。
你能算出另一组合适的解吗?

请填写该解中最小的数字。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。谢谢
           

    答案:-30

#比赛需要 很是暴力
def sam():
    for i in range(33):
        for j in range(33):
            for k in range(33):
                if(i**2+j**2+k**2==1000):
                    print(i,j,k)

sam()
           

2.星系炸弹

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

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

    答案:2017-08-05

3.奇妙的数字

小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。
你能猜出这个数字是多少吗?
           

    答案:69

def sam(li,pin):
    num=[0,0,0,0,0,0,0,0,0,0];
    li=str(li)
    pin=str(pin)
    for i in range(len(li)):
        num[int(li[i])]+=1
    for i in range(len(pin)):
        num[int(pin[i])]+=1
    for i in range(10):
        if(num[i]!=1):
            return 0
    return 1


for i in range(4,1000):
    a=sam(i**2,i**3)
    if a==1:
        print('答案:',i)
        break
           

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",_____________________________________________);  //填空
	          
	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;
}

对于题目中数据,应该输出:
+------------------+
|                  |
|     abcd1234     |
|                  |
|                  |
+------------------+

(如果出现对齐问题,参看【图1.jpg】)


注意:只填写缺少的内容,不要书写任何题面已有代码或说明性文字。
           

    答案:(width-strlen(buf))/2-1,"",buf,(width-strlen(buf))/2-1,""

5.九数组分数

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

#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);
		_____________________________________________ // 填空处
	}
}
	
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;}

6.牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

请填写该整数,不要填写任何多余的内容或说明文字。
           

    答案:3598180

result=0
def sam(a,num):
    global result
    if num==13:
        result+=1
        return
    if a==14 or num>13:
        return
    for i in range(5):
        sam(a+1,num+i)
sam(1,0)
print(result)
           

7.手链样式

小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。
他想用它们串成一圈作为手链,送给女朋友。
现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?

请你提交该整数。不要填写任何多余的内容或说明性的文字。
           

    答案:1170(还是暴力破解适合我)

pan=set()
sam=0
sa=[1,2,3]
def list_to_int(a):
    result=0
    for i in range(12):
        result+=10**(11-i)*a[i]
    return result
def to_add(a):
    global pan,sam
    b=a.copy()
    pan.add(list_to_int(b))
    for i in range(11):
        c=b[0]
        for j in range(1,12):
            b[j-1]=b[j]
        b[11]=c
        pan.add(list_to_int(b))
    b=a.copy()
    b.reverse()
    pan.add(list_to_int(b))
    for i in range(11):
        c=b[0]
        for j in range(1,12):
            b[j-1]=b[j]
        b[11]=c
        pan.add(list_to_int(b))
    sam+=1


def kol(a,b,num):
    global pan,sa
    if num==12:
        if list_to_int(a) not in pan:
            to_add(a)
        return
    for i in range(3):
        if b[i]!=0:
            b[i]-=1
            a.append(sa[i])
            kol(a.copy(),b.copy(),num+1)
            a.pop()
            b[i]+=1


kol([],[3,4,5],0)
print('总组合情况:',len(pan),'无重合的情况有:',sam)
           

继续阅读