第六届蓝桥杯大赛个人赛决赛(软件类)真题+省赛(软件类)真题(第一题~第四题)

发布时间:2024年01月23日

第六届蓝桥杯大赛个人赛决赛(软件类)真题

第一题? 题目:机器人数目

少年宫新近邮购了小机器人配件,共有3类,其中, A类含有:8个轮子,1个传感器 B类含有:6个轮子,3个传感器 C类含有:4个轮子,4个传感器
他们一共订购了100套机器人,收到了轮子600个,传感器280个。根据这些信息请你计算:B类型机器人订购了多少个?
请直接提交该整数,不要填写任何多余内容。


#include <iostream>
using namespace std;

int main()
{
    int a,b,c,n=0;
    // 定义变量a、b、c和n,用于存储数对中的两个数和结果
    // 初始化n为0,表示未找到符合条件的数对
    for(a=0; a<=75; a++)
    {
        for(b=0; b<=93; b++)
        {
            // 定义变量c,用于存储两个数之差
            c=100-a-b;
            // 判断两个条件是否成立
            if((8*a+6*b+4*c==600)&&(a+3*b+4*c==280))
            {
                // 输出符合条件的数对中的较小的数
                cout<<b<<endl;
                // 标记n为1,表示已找到符合条件的数对
                n=1;
            }
            if(n==1)
                break;
        }
        // 如果n为1,则跳出循环,表示已找到符合条件的数对
        if(n==1)
            break;
    }
    // 返回0,表示程序正常结束
    return 0;
}

运行结果 如下:


第二题? 题目:生成回文数

所谓回文数就是左右对称的数字,比如:

585,5885,123321…

当然,单个的数字也可以算作是对称的。

小明发现了一种生成回文数的方法:

比如,取数字19,把它与自己的翻转数相加:

19 + 91 = 110,如果不是回文数,就再进行这个过程:

110 + 011 = 121 这次是回文数了。

200以内的数字中,绝大多数都可以在30步以内变成回文数,只有一个数字很特殊,就算迭代了1000次,它还是顽固地拒绝回文!

请你提交该顽固数字,不要填写任何多余的内容。


#include<stdio.h>
/*
 * 这段代码定义了一个名为 fan 的函数,用于计算一个 n 位数的阶乘。
 * 函数的输入参数是一个 long long 类型的 n,表示需要计算阶乘的数字。
 * 函数的返回值是一个 long long 类型的数字,表示计算得到的阶乘。
 */
long long fan(long long n)
{
    //初始化一个 long long 类型的变量 sum,用于存储计算得到的阶乘。
    long long sum = 0;
    
    /*
     * 使用一个 while 循环,当 n 不为 0 时,执行以下操作:
     * 1. 计算 n 的个位数 t,并将其存储在 int 类型的变量 t 中。
     * 2. 将 t 乘以 10,并将其加到 sum 中。
     * 3. 将 n 除以 10,并将商存储回 n。
     */
    while(n)
    {
        int t = n % 10;
        sum = sum * 10 + t;
        n = n/10;
    }
    
    //返回计算得到的阶乘 sum。
     
    return sum;
}

/*
 * 调用 fan 函数并计算 1 到 199 的阶乘。
 * 首先定义一个 long long 类型的变量 n,用于存储需要计算阶乘的数字。
 * 然后使用一个 for 循环,从 1 到 199 遍历所有数字。
 * 在循环内部,定义一个 int 类型的变量 j,用于存储循环的次数。
 * 使用另一个 for 循环,从 0 到 29 遍历所有可能的阶乘。
 * 如果 fan 函数计算得到的阶乘等于当前数字 n,则将 n 加回 fan 函数的输入,并跳出循环。
 * 如果循环次数 j 大于等于 30,则输出当前数字 i。
 */
int  main()
{
    long long n;
    int i,j;
    for(i=1;i<200;i++)
    {
        n = i;
        for(j=0;j<30;j++)
        {
            if(n != fan(n))
            {
                n += fan(n);
            }
            else
                break;
        }
        if(j >= 30)
            printf("%d\n",i);
    }
    return 0;
}

运行结果如下:


第三题? 题目:空心菱形

填空内容为: s = pr(i+1, 2*(n-i)-1) + "\n";


第四题? 题目:奇怪的数列

从x星截获一份电码,是一些数字,如下:

13
1113

3113

132113
1113122113

......

YY博士经彻夜研究,发现了规律:
第一行的数字随便是什么,以后每一行都是对上一行“读出来”
比如第2行,是对第1行的描述,意思是:1个1,1个3,所以是:1113第3行,意思是:3个1.1个3,所以是:3113
请你编写一个程序,可以从初始数字开始,连续进行这样的变换。数据格式:
第一行输入一个数字组成的串,不超过100位
第二行,一个数字m,表示需要你连续变换多少次,n不超过20
输出一个串,表示最后一次变换完的结果。例如:用户输出:7
则程序应该输出:13211321322115
资源约定:
峰值内存消耗(含虚拟机)<512M CPU消耗<1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入.”的多余内容。

#include <stdio.h>
#include <string.h>
char a[10001],b[10001],c[10001];
int n,cou=0,cou1=0,s=0,j;
char flag;
int main()
{
	scanf("%s%d",&a,&n);
	int i;
	while(n--)
	{
		flag=a[0];
		cou=0;
		for(i=0;i<=strlen(a);i++)
			{
				if(a[i]==flag)
					{
						cou++;
					}
				else {
					s=0;
					strcpy(c,"");
					while(cou!=0)	
						{
							c[s]='0'+cou%10;
							s++;
							cou=cou/10;
						}
					for(j=s-1;j>=0;j--)	
						{
							b[cou1]=c[j];
							cou1++;
						}
					b[cou1]=flag;
					cou1++;
					flag=a[i];
					cou=1;
				}
			}
	strcpy(a,b);
	strcpy(b,"");
	cou1=0;
	}
	printf("%s",a);
	return 0;
}

?


第五题? 题目:密文探索

福尔摩斯从X星收到一份资料,全部是小写字母组成。他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打
程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性
数据格式:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024

紧接看一行是一个整数1,表示以下有n行密码,1-n<=1000紧接着是n行字符串,都是小写字母组成,长度都为8
要求输出:
一个整数,表示每行密码的所有排列在s中匹配次数的总和。
例如:
用户输入:

abbbbaabbcccc

2

aaaabbbb
abcabccc
则程序应该输出:
4
这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
资源约定:
峰值内存消耗(含虚拟机)<512M CPU消耗<5000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入”的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。注意:主类的名字必须是:Main,否则按无效代码处理。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

char s[1100000];
int a[1100000];
int flag1[123];
int flag2[123];

int main()
{
	memset(s,0,sizeof(s));
	int i,j,k,r;
	int sum=0;
	cin>>s;
	i=0;
	while(s[i]!='\0')
	{
		a[i]=(int)s[i];//将字母转化为int类型的数字,a-z为97-122
		i++;
	}
	int len=i;
	int n;
	cin>>n;
	char b[9];
	for(i=0;i<n;i++)
	{
		cin>>b;
		for(j=0;j<8;j++)
			flag1[(int)b[j]]++;//统计密码中各字符的个数
		for(k=0;k<len-7;k++)
		{
			for(r=k;r<k+8;r++)
				flag2[a[r]]++;//统计主串中长度为8的子串中各字符的个数
			for(r=97;r<123;r++)
				if(flag1[r]!=flag2[r])//判断,密码与子串的各字符的个数是否相等
					break;
			if(r==123)
				sum++;
			memset(flag2,0,sizeof(flag2));
		}
		memset(flag1,0,sizeof(flag1));
	}
	cout<<sum;
    return 0;
}

?


第六题? 题目:居民集会




第六届蓝桥杯大赛个人赛省赛(软件类)真题?

第一题? 题目:隔行变色

隔行变色
Excel 表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式.小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,..现在小明想知道,从第21行到第50行一共包含了多少个蓝色的行.
请你直接提交这个整数,千万不要填写任何多余的内容。

#include<stdio.h>
int main()
{
 int n=0,i;
 for(i=21;i<51;i++){
  if(i%2!=0){
   n++;
  }
 }
 printf("%d",n);
 return 0;
}

运行结果 如下:?


?第二题? 题目:立方尾不变

有些数字的立方的末尾正好是该数字本身,比如:1,4,5,6,9,24,25...
请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个。
请提交该整数,不要填写任何多余的内容.

#include<stdio.h>
int main()
{
	long long n,s=0;
	for(n=1;n<10000;n++)
	{
		if(n<10){
			if(n*n*n%10==n) s++; 
		}else if(n<100){
			if(n*n*n%100==n) s++;
		}else if(n<1000){
			if(n*n*n%1000==n) s++;
		}else if(n<10000){
			if(n*n*n%10000==n) s++;
		}
	}
	printf("%d",s);
	return 0;
}

运行结果 如下:?


??第三题? 题目:三羊献瑞

/*
 * 这段C语言代码实现了一个求解特定数字组合的函数。
 * 输入:一个整数n,表示数字的范围(1-9)。
 * 输出:如果存在满足条件的数字组合,输出四个数字(a, b, c, d)
 */
#include<stdio.h>

int main()
{
	int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;	//dcef + 1abc = 1aecg
	for(d = 0; d <= 9; d++)
	{	
		if(d == 1)
			d++;
		for(c = 0; c <= 9; c++)
		{
			while(c == d || c == 1)
			{				
				c++;
			}
			if(c == 10)
				break;
			for(e = 0; e <= 9; e++)
			{
				while(e == c || e == d || e == 1)
				{					
					e++;
				}
				if(e == 10)
					break;
				for(f = 0; f <= 9; f++)
				{
					while(f == 1 || f == c || f == d || f == e)
					{						
						f++;
					}	
					if(f == 10)
						break;					
					for(a = 0; a <= 9; a++)
					{
						while(a == 1 || a == c || a == d || a == e || a == f)
						{							
							a++;
						}
						if(a == 10)
							break;
						for(b = 0; b <= 9; b++)
						{
							while(b == 1 || b == c || b == d || b == e || b == f || b == a)
							{								
								b++;
							}
							if(b == 10)
								break;
							for(g = 0; g <= 9; g++)
							{
								while(g == 1 || g == c || g == d || g == e || g == f || g == a || g == b)
								{
									g++;
								}	
								if(g == 10)
									break;
								if(d * 1000 + c * 100 + e * 10 + f + 1000 + a * 100 + b * 10 + c == 10000 + a * 1000 + e * 100 + c * 10 + g)
								{
									printf("%d%d%d%d\n",1,a,b,c);
									printf("%d %d %d %d + 1 %d %d %d = 1 %d %d %d %d \n",d,c,e,f,a,b,c,a,e,c,g);
								}
									
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

C语言代码的运行逻辑如下:
//1. 首先,引入了<stdio.h>头文件,用于输入输出。
//2. 定义了一个main()函数,这是C语言程序的入口。
//3. 定义了6个整型变量a、b、c、d、e、f 和g,用于存储计算结果。
//4. 进入一个for循环,循环变量d的取值范围是0到9。
//5. 在循环内部,首先判断d是否等于1,如果是,则d自增1。
//6. 然后进入一个while循环,判断c是否等于d或1,如果是,则c自增1。如果c等于10,则跳出循环。
//7. 接下来进入另一个while循环,判断e是否等于c、d、1、e、f,如果是,则e自增1。如果e等于10,则跳出循环。
//8. 进入另一个while循环,判断f是否等于1、c、d、e、f,如果是,则f自增1。如果f等于10,则跳出循环。
//9. 接下来进入一个for循环,循环变量a的取值范围是0到9。
//10. 在循环内部,首先判断a是否等于1、c、d、e、f、1,如果是,则a自增1。如果a等于10,则跳出循环。
//11. 接下来进入另一个for循环,循环变量b的取值范围是0到9。
//12. 在循环内部,首先判断b是否等于1、c、d、e、f、a,如果是,则b自增1。如果b等于10,则跳出循环。
//13. 接下来进入另一个while循环,判断g是否等于1、c、d、e、f、a、b,如果是,则g自增1。如果g等于10,则跳出循环。
//14. 进入一个if语句,判断d * 1000 + c * 100 + e * 10 + f + 1000 + a * 100 + b * 10 + c是否等于10000 + a * 1000 + e * 100 + c * 10 + g。如果是,则输出结果,并将a、b、c的值分别打印出来。
//15. 最后,main()函数返回0,表示程序运行成功。

运行结果 如下:?


第四题? 题目:格子中输出

填空内容为: (width-strlen(s)-2)/2, \" \", buf, (width-strlen(s)-2)/2, \" \")?

文章来源:https://blog.csdn.net/2301_77935571/article/details/135758519
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。