当前位置 博文首页 > cr496352127的博客:2012年第三届蓝桥杯决赛真题补充练习
Part 1:结果填空+代码填空
1. 2012C/C++高职组T1【结果填空】(满分12分)
??? 素数就是不能再进行等分的整数。比如:7,11。而9不是素数,因为它可以平分为3等份。一般认为最小的素数是2,接着是3,5,...
??? 请问,第100002(十万零二)个素数是多少?
??? 请注意:“2” 是第一素数,“3” 是第二个素数,依此类推。
??? 不需要提交源代码,只要写出准确的结果即可!
??? 答案写在:“解答.txt”中,不要写在这里。
【分析】循环+素数判定
#include <stdio.h>
#include <math.h>
int is_prime(int n) //判素数
{
int i,flag=1;
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=0;
break;
}
}
return flag;
}
int main()
{
int i=2,num=1; //i记录当前数,num记录第num个素数
while(num<=100002)
{
if(is_prime(i))
printf("No.%d:%d\n",num++,i);
i++;
}
return 0;
}
【答案】1299743
2. 2012C/C++高职组T2 【代码填空】(满分14分)
??? 当数据量较小的时候,使用基本排序方案并不会显著影响程序性能。
??? 选择排序是十分常用的基本排序方案之一。它的每一趟排序都从一个序列中选择最小的那个元素,加入到逐步扩展的已排序序列。初始的时候,已排序序列为第一个元素,待排序序列为剩下的所有元素,即从第二个元素到结尾。
??? 下面的代码演示了对int数组中的n个元素进行基本选择排序。请仔细阅读并分析代码,填写空白处的代码,使得程序的逻辑合理,结果正确。
void sel_sort(int* x, int n)
{
?int k, i, m, t;
?for(k=0; k<n-1; k++)? // 多趟排序
?{
??m = _____________;? // 填空1
??for(i=k+1; i<n; i++)
??{
???if(x[i] < x[m]) _________________;? // 填空2
??}
??t = x[k];
??x[k] = x[m];
??x[m] = t;
?}
}
void display(int* x, int n)
{
?for(int i=0; i<n; i++)? printf("%d ", x[i]);
?printf("\n");
}
void main()
{
?int N = 10;
?int a[] = {5, 12, 35, 28, 19, 22, 36, 17, 4, 11};
?display(a, N);
?sel_sort(a, N);
?display(a, N);
}
【注意】
??? 只填写缺少的部分,不要抄写已有的代码。
??? 所填写代码不超过1条语句(句中不会含有分号)
??? 所填代码长度不超过256个字符。
??? 答案写在“解答.txt”中,不要写在这里!
【分析】选择排序(注意基本排序算法的灵活应用)
#include <stdio.h>
void sel_sort(int* x, int n)
{
int k, i, m, t;
for(k=0; k<n-1; k++) // 多趟排序
{
m = k; // 填空1
for(i=k+1; i<n; i++)
{
if(x[i] < x[m]) m=i; // 填空2
}
t = x[k];
x[k] = x[m];
x[m] = t;
}
}
void display(int* x, int n)
{
for(int i=0; i<n; i++) printf("%d ", x[i]);
printf("\n");
}
int main()
{
int N = 10;
int a[] = {5, 12, 35, 28, 19, 22, 36, 17, 4, 11};
//int a[] ={1,7,3,5,9,4,8,11,16,14};
display(a, N);
sel_sort(a, N);
display(a, N);
return 0;
}
【答案】填空1:k??? 填空2:m=i
3. 2012Java本科组T1【结果填空】(满分9分)
??? 复杂现象背后的推动力,可能是极其简单的原理。科学的目标之一就是发现纷繁复杂的自然现象背后的简单法则。爱因斯坦的相对论是这方面的典范例证。
??? 很早的时候,生物学家观察某区域某种昆虫的数量(称为虫口数)之逐年变化规律,就十分迷惑:有的时候是逐渐增多达到一个平衡值。有的时候在两个数字间周期跳动。有的时候则进入一片混乱,类似随机数字一样变化(称为混沌现象)。
??? 慢慢地,人们从数学中更清晰地观察到了这一现象,并因此开创了:符号动力学、非线性动力学等研究领域。
??? 一个著名的虫口数目简化模型如下:
??? x' = x * (1 - x) * r
??? 这里,x? x' r 都是浮点数。
?
??? 其中,x 表示当年的虫口数,x' 表示下一年的虫口数。它们的取值范围在 0 与 1 之间,实际上表示的是:虫口的总数占环境所能支持的最大数量的比率。
??? r 是常数(环境参数),r的取值范围在 [0,4]。
??? 令人惊讶的是:这个简单的迭代公式有着不同寻常的神秘性质!
??? 一般来说,多次迭代后,虫口数的稳定模式与x的初始值无关,而与 r 有关!
??? 例如:无论x初始值是多少,当 r = 2.5 的时候,x 多次迭代后会趋向于 0.6。
??? 而当 r = 3.2 的时候,x 的值会趋向于在 0.799 与 0.513 之间周期性摆动。
??? 那么,r = 3.62 的时候,你观察到有什么周期现象发生吗?
??? 不需要提交源代码,只要写出你的结论即可!
??? 答案写在:“解答.txt”中,不要写在这里。?
【分析】迭代,可调用系统函数实现逐步输出结果的效果。
#include <stdio.h>
#include <windows.h>
int main()
{
double x,xx,r; //当年的虫口数,下一年的虫口数,常数
x=0.5; //x置初值0.5
scanf("%lf",&r);
while(1)
{
xx=x*(1-x)*r;
x=xx;
printf("%lf\n",xx);
Sleep(1000);
}
return 0;
}
【参考答案】虫口数目函数呈锯齿状变化,虫口数目不存在连续两年增加和连续两年减少的情况。
4. 2012Java高职组T1【结果填空】 (满分11分)
??? 看这个算式:
?
??? ☆☆☆ + ☆☆☆ = ☆☆☆
??? 如果每个五角星代表 1 ~ 9 的不同的数字。
??? 这个算式有多少种可能的正确填写方法?
??? 173 + 286 = 459
??? 295 + 173 = 468
??? 173 + 295 = 468
??? 183 + 492 = 675
??? 以上都是正确的填写法!
??? 注意:
??? 111 + 222 = 333 是错误的填写法!
??? 因为每个数字必须是不同的!
??? 也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
??? 注意:
??? 不包括数字“0”!
??? 注意:
??? 满足加法交换率的式子算两种不同的答案。
??? 所以答案肯定是个偶数!
??? 注意:
??? 只要求计算不同的填法的数目
??? 不要求列出所有填写法
??? 更不要求填写源代码!
??? 答案不要写在这里,请写在“解答.txt”中!
【分析】枚举+全排列
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int cnt=0;
int n1,n2,n3;
int a[9]={1,2,3,4,5,6,7,8,9};
do
{
n1=a[0]*100+a[1]*10+a[2];
n2=a[3]*100+a[4]*10+a[5];
n3=a[6]*100+a[7]*10+a[8];
if(n1+n2==n3)
{
printf("%d+%d=%d\n",n1,n2,n3);
cnt++;
}
} while(next_permutation(a,a+9));
printf("count=%d\n",cnt);
return 0;
}
【答案】336
Part 2:程序设计
1.
cs