当前位置 博文首页 > cr496352127的博客:2012年第三届蓝桥杯决赛真题补充练习

    cr496352127的博客:2012年第三届蓝桥杯决赛真题补充练习

    作者:[db:作者] 时间:2021-09-21 18:07

    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