蓝桥杯第八届试题及答案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liujie2232692543/article/details/80292020

第一题:

标题:哥德巴赫分解
哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和。
你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行。
实际上,一般一个偶数会有多种不同的分解方案,我们关心包含较小素数的那个方案。
对于给定数值范围,我们想知道这些包含较小素数方案中最大的素数是多少。
比如,100以内,这个数是19,它由98的分解贡献。
你需要求的是10000以内,这个数是多少?

注意,需要提交的是一个整数,不要填写任何多余的内容(比如,说明性的文字)

答案:173

我的代码:

#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;

int prime(int h)
{
	int ok=0;
	for(int i=2;i<h-1;i++)
	{
		if(h%i!=0)
		{
			ok=1;
		}
		else
		{
			ok=0;
			break;
		}
	}
	if(ok==1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int cmp(int a,int b)
{
	if(a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

int main()
{
	int n;
	scanf("%d",&n);
	int a[10005],y=0,k;
	int z1[10005],s1=0;
	for(int i=n;i>=4;i-=2)
	{
		for(int g=2;g<i/2;g++)
		{
				k=i-g;
				if((prime(k)==1)&&(prime(g)==1))
				{
				//	printf("%d %d\n",g,k);
					a[y++] = g;
					break;
				}
		}
	}
	sort(a,a+y);
	printf("%d\n",a[y-1]);
	return 0;
}

第二题



标题:数字划分

w星球的长老交给小明一个任务:
1,2,3...16 这16个数字分为两组。
要求:
这两组数字的和相同,
并且,两组数字的平方和也相同,
并且,两组数字的立方和也相同。

请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。

这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 ...  这样的答案。

注意,只提交这一组数字,不要填写任何多余的内容。

----------------------------------------
笨笨有话说:
    只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。
凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:
    既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。

貌似都是8个成员的可能性很大啊。


答案:1 4 6 7 10 11 13 16

我的代码:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
	int z[1000];
	for(int a=2;a<=16;a++)
	{
		for(int b=2;b<=16;b++)
		{
			for(int c=2;c<=16;c++)
			{
				for(int d=2;d<=16;d++)
				{
					for(int e=2;e<=16;e++)
					{
						for(int f=2;f<=16;f++)
						{
							for(int g=2;g<=16;g++)
							{
								int h=1;
								int z1=0;
								int sum = 0;
								int sum2=0;
								int sum3=0;
								for(int l=2;l<=16;l++)
								{
									if((l!=h)&&(l!=a)&&(l!=b)&&(l!=c)&&(l!=d)&&(l!=e)&&(l!=f)&&(l!=g))
									{
										z[z1++] = l;
									} 
								}
								for(int o=0;o<z1;o++)
								{
									sum3+=z[o];
									sum+=z[o]*z[o];
									sum2+=z[o]*z[o]*z[o];
								}
								if(a+b+c+d+e+f+g+h==sum3)
								{
									if(a*a+b*b+c*c+d*d+e*e+f*f+g*g+1==sum)
									{
										if(a*a*a+b*b*b+c*c*c+d*d*d+e*e*e+f*f*f+g*g*g+1==sum2)
										{
											printf("%d %d %d %d %d %d %d %d\n",h,a,b,c,d,e,f,g);
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	return 0;
 } 

第三题



标题:表达式计算


虽然我们学了许久的程序设计,但对于简单的四则混合运算式,如果让我们完全白手起家地编程来解析,还是有点棘手。


这里,我们简化一下问题,假设只有加法和乘法,并且没有括号来改变优先级。
再假设参加运算的都是正整数。


在这么多的限制条件下,表达式的解析似乎简单了许多。
下面的代码解决了这个问题。请仔细阅读源码,并填写划线部分缺少的代码。




#include <stdio.h>


int f3(const char* s, int begin, int end)
{
int sum = 0;
int i;
for(i=begin; i<end; i++){
if(s[i]==' ') continue;
sum = sum * 10 + (s[i]-'0');
}
return sum;
}


int f2(const char* s, int begin, int end)
{
int p = begin;
int pro = 1;
while(1){
int p0 = p;
while(p!=end && s[p]!='*') p++;
pro *= _____________f3(s,p0,p)__________________;  //填空
if(p==end) break; 
p++;
}
printf("f2: pro=%d\n", pro);
return pro;
}


int f(const char* s)
{
int p = 0;
int sum = 0;
while(1){
int p0 = p;
while(s[p]!=0 && s[p]!='+') p++;
sum += f2(s,p0,p);
if(s[p]==0) break;
p++;
}

return sum;
}


int main()
{
int x = f("12+18+5*4*3+10");
printf("%d\n", x);
return 0;
}


注意:只填写划线处缺少的内容,不要填写已有的代码或符号,也不要填写任何解释说明文字等。

第四题



标题: 小数第n位


我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。


本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。


输入:
 一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出:
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。


比如:
输入:
1 8 1


程序应该输出:
125


再比如:
输入:
1 8 3


程序应该输出:
500


再比如:
输入:
282866 999000 6


程序应该输出:
914


资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms


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


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。


提交时,注意选择所期望的编译器类型。


----------------------------------------
笨笨有话说:
    这个除法小学就会算啊,模拟手算除法的过程就可以了吧。
只是数有点大啊....
管它呢,能算多远算多远....

歪歪有话说:
    如果我能确定循环节从哪里开始到哪里结束,再大的数不过就是与它取模的余数等价啊


 

我的代码:

#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;
int vis[10];

int main()
{
	int a,b,n;
	memset(vis,0,sizeof(vis));
	scanf("%d %d %d",&a,&b,&n);
	int p[1000],q,y=1;
	int h[1000];
	int h1=0;
	p[0]=a/b;
	q=a%b;
	int ans=0;
	int pos = 0;
	int ok1=0;
	while(q!=0)
	{
		p[y++]=q*10/b;
		q=q*10%b;
		if(vis[q]==0)
		{
			ans++;
			h[++h1]=q; 
			vis[q]=h1;
		}
		else
		{
			ok1=1;
			break;
		}
	}
	if(ok1==0)
	{
		printf("%d %d %d\n",p[n],p[n+1],p[n+2]);	
	}
	else
	{
	//	printf("%d %d %d\n",p[n%(ans-1)],p[n%ans],p[n%(ans+1)]);
		if(n%ans==0)
		{
			printf("%d ",p[ans]);
		}
		else
		{
			printf("%d ",p[n%ans]);
		}
		n++;
		if(n%ans==0)
		{
			printf("%d ",p[ans]);
		}
		else
		{
			printf("%d ",p[n%ans]);
		}
		n++;
		if(n%ans==0)
		{
			printf("%d\n",p[ans]);
		}
		else
		{
			printf("%d\n",p[n%ans]);
		}
	}
	return 0;
} 

第五题



标题:分考场


n个人参加某项特殊考试。
为了公平,要求任何两个认识的人不能分在同一个考场。
求最少需要分几个考场才能满足条件。


输入格式:
第一行,一个整数n(1<n<100),表示参加考试的人数。
第二行,一个整数m,表示接下来有m行数据
以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n)  表示第a个人与第b个人认识(编号从1开始)。


输出格式:
一行一个整数,表示最少分几个考场。


例如:
输入:
5
8
1 2
1 3
1 4
2 3
2 4
2 5
3 4
4 5


程序应该输出:
4


再比如:
输入:
5
10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5


则程序应该输出:
5




资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms


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


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

 

提交时,注意选择所期望的编译器类型。

我的代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
int vis[100][100];
using namespace std;

vector<int> room[100];
int n,m;
int top;

int CHU()
{
	memset(vis,0,sizeof(vis));
	for(int i=0;i<n;i++)
	{
		room[i].clear();
	}
	top = 0;
}

int sol(int h)
{
	int a,b;
	for(int i=0;i<h;i++)
	{
		scanf("%d %d",&a,&b);
		vis[a][b] = 1;
		vis[b][a] = 1;
	}
}

int judge(int i,int j)
{
	int a = i;
	int si = room[j].size();
		for(int p=0;p<si;p++)
		{
			int b = room[j][p];
			if(vis[a][b]==1)
			{
				return 0;
			}
		}
	return 1;
}

int jie(int n,int top)
{
	for(int i=0;i<n;i++)
	{
		int ok = 0;
		for(int j=0;j<top;j++)
		{
			if(judge(i,j)==1)
			{
				room[j].push_back(i);
				ok=1;
				break;
			}
		}
		if(ok==0)
		{
			room[top].push_back(i);
			top++;
		}
	}
	return top;
}

int main()
{
	CHU();
	scanf("%d %d",&n,&m);
	sol(m);
	printf("%d\n",jie(n,top));
	return 0;
}

第六题



标题:合根植物


w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。
这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。


如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗?


输入格式:
第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。
接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)
接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。


格子的编号一行一行,从上到下,从左到右编号。
比如:5 * 4 的小格子,编号:
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16
17 18 19 20


样例输入:
5 4
16
2 3
1 5
5 9
4 8
7 8
9 10
10 11
11 12
10 14
12 16
14 18
17 18
15 19
19 20
9 13
13 17




样例输出:
5


其合根情况参考图[p1.png]


资源约定:
峰值内存消耗 < 256M
CPU消耗  < 2000ms


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


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。


注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

 

提交时,注意选择所期望的编译器类型。

我的代码

猜你喜欢

转载自blog.csdn.net/liujie2232692543/article/details/80292020