2012程序设计竞赛基础实训22
- 格式:doc
- 大小:142.00 KB
- 文档页数:15
一、实训目的本次实训旨在通过实际编写程序,巩固和加深对程序设计基础知识的理解,提高编程能力和解决问题的能力。
通过实训,使学生能够掌握程序设计的基本流程,熟悉常用编程语言和开发工具,具备独立编写程序、调试和优化程序的能力。
二、实训内容1. 编程语言:C语言2. 开发工具:Visual Studio3. 实训任务:(1)编写一个计算两个整数相加的程序;(2)编写一个计算两个整数相减的程序;(3)编写一个计算两个整数相乘的程序;(4)编写一个计算两个整数相除的程序,要求考虑除数为0的情况;(5)编写一个计算阶乘的程序;(6)编写一个冒泡排序的程序,对一组整数进行排序;(7)编写一个插入排序的程序,对一组整数进行排序;(8)编写一个选择排序的程序,对一组整数进行排序。
三、实训过程1. 编写计算两个整数相加的程序```c#include <stdio.h>int main() {int a, b, sum;printf("请输入两个整数:");scanf("%d %d", &a, &b);sum = a + b;printf("两数之和为:%d\n", sum); return 0;}```2. 编写计算两个整数相减的程序```c#include <stdio.h>int main() {int a, b, sub;printf("请输入两个整数:");scanf("%d %d", &a, &b);sub = a - b;printf("两数之差为:%d\n", sub); return 0;}```3. 编写计算两个整数相乘的程序```c#include <stdio.h>int main() {int a, b, mul;printf("请输入两个整数:");scanf("%d %d", &a, &b);mul = a b;printf("两数之积为:%d\n", mul);return 0;}```4. 编写计算两个整数相除的程序,考虑除数为0的情况```c#include <stdio.h>int main() {int a, b, div;printf("请输入两个整数:");scanf("%d %d", &a, &b);if (b == 0) {printf("除数不能为0\n");} else {div = a / b;printf("两数之商为:%d\n", div);}return 0;}```5. 编写计算阶乘的程序```c#include <stdio.h>int factorial(int n) {if (n == 0) {return 1;} else {return n factorial(n - 1);}}int main() {int n;printf("请输入一个整数:");scanf("%d", &n);printf("%d的阶乘为:%d\n", n, factorial(n)); return 0;}```6. 编写冒泡排序的程序```c#include <stdio.h>void bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}int main() {int arr[] = {5, 3, 8, 6, 2};int n = sizeof(arr) / sizeof(arr[0]); int i;bubbleSort(arr, n);printf("排序后的数组:");for (i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}```7. 编写插入排序的程序```c#include <stdio.h>void insertionSort(int arr[], int n) {int i, j, key;for (i = 1; i < n; i++) {key = arr[i];j = i - 1;while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}int main() {int arr[] = {5, 3, 8, 6, 2};int n = sizeof(arr) / sizeof(arr[0]); int i;insertionSort(arr, n);printf("排序后的数组:");for (i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}```8. 编写选择排序的程序```c#include <stdio.h>void selectionSort(int arr[], int n) { int i, j, min_idx, temp;for (i = 0; i < n - 1; i++) {min_idx = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_idx]) { min_idx = j;}}temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;}}int main() {int arr[] = {5, 3, 8, 6, 2};int n = sizeof(arr) / sizeof(arr[0]);int i;selectionSort(arr, n);printf("排序后的数组:");for (i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;}```四、实训心得通过本次实训,我深刻体会到了程序设计的重要性。
百度之星Astar2012程序设计大赛初赛试题(第一场)————及B题答案比赛说明百度之星初赛:2012年6月2日、6月3日10:00Am~12:00Pm本次大赛的初赛的初赛采取在线答题、编译,离线判题的形式,选手报名后,可以在6月2日、6月3日任选一天参加比赛,也可选择两场都参加。
针对每题,交题后,系统将给出程序编译是否正确的结果,但不会给出程序是否通过全部测试数据的评价;当场比赛结束后,所有选手的针对每题所写的程序将被离线评判,每题根据程序通过测试数据的数目计算得分。
每场初赛根据单场所有题目总分计算成绩,选出当场成绩在前400名的选手进入复赛(第一场已经进入复赛的选手参加第二场比赛如果再次晋级,将被不在第二场参与排名)。
2012年6月2日,2012百度之星Astar2012程序设计大赛初赛打开大幕。
这里提供了初赛第一场的题目,供有未进初赛和其它有兴趣的朋友研究。
初赛第一场共4题。
分别是度度熊就是要第一个出场、小小度刷礼品、集合的交与并、轮子上的度度熊。
目录比赛说明······················· 1·A:度度熊就是要第一个出场·············· 2·B:小小度刷礼品··················· 5·C:集合的交与并····················6·D:轮子上的度度熊···················6·A:度度熊就是要第一个出场题目描述Baidu年会安排了一场时装秀节目。
noip 2012 普及组第一题
2012年全国青少年信息学奥林匹克联赛(NOIP)是一场为广大青少年程序设计爱好者提供展示自己编程能力和竞技技巧的赛事。
普及组是面向初学者的比赛组别,题目设计相对简单,旨在培养学生对程序设计的兴趣和基本能力。
下面我们就来分析2012年NOIP普及组的第一题。
第一题的题目描述如下:小明同学有一个长度为n的序列,他希朝将这个序列从小到大排列,但是他只能进行一种操作,即把序列中的一个数加1或者减1。
问最少进行多少次操作,小明能够将这个序列排列为非降序序列。
这是一道典型的贪心算法问题。
我们可以先对原序列进行排序,得到一个非降序序列。
然后遍历每个数,计算将这个数变为当前位置的数所需的操作次数,累加得到总操作次数。
最后取所有数的总操作次数的最小值即为答案。
具体的实现过程如下:
1. 对原序列进行排序,得到一个非降序序列。
2. 遍历每个数,计算将这个数变为当前位置的数所需的操作次数。
3. 累加得到总操作次数。
4. 取所有数的总操作次数的最小值即为答案。
这样,我们就得到了最少操作次数,使得序列变为非降序序列的方法。
这个算法的时间复杂度为O(nlogn),即对序列排序的复杂度,是一个较为高效的算法。
通过解答这道题目,学生不仅能够锻炼自己的编程能力,还能够培养贪心算法的思维方式,对算法的设计和分析有了更深的理解。
希望广大学生能够通过参加NOIP等比赛,不断提升自己的程序设计能力,享受编程的乐趣。
《visualbasic程序设计》实训与习题指
导
Visual Basic程序设计是一种快速有效的应用程序开发方式,它拥有丰富的功能,可以实现复杂的应用程序开发。
Visual Basic程序设计的实训和题指导可以帮助初学者快速掌
握Visual Basic的基本原理和技巧,从而更好地掌握开发技能。
首先,在研究Visual Basic程序设计之前,应先掌握
Visual Basic编程语言的基本知识,包括语法、程序结构、数
据类型、控件、函数等,并熟练掌握Visual Basic的编程环境。
其次,在实训过程中,可以通过实际操作,更加深入地了解Visual Basic的基本原理和关键技术,并能够熟练操作
Visual Basic的调试工具,使其能够更好地检查程序的运行情况。
此外,在题指导过程中,可以通过解决许多实际问题,进一步加深对Visual Basic的理解,熟练掌握Visual Basic程序
设计的实际技术,并能够独立解决实际问题。
最后,在Visual Basic程序设计的实训和题指导过程中,
应多加练,不断的完善自己的技能,使自己能够熟练的操作Visual Basic,并能够更好地运用Visual Basic程序设计技术满
足开发需求。
总之,Visual Basic程序设计的实训和题指导可以帮助初学者更快地掌握Visual Basic的基本原理和技巧,从而更好地掌握开发技能,使其能够熟练地操作Visual Basic,并能够更好地运用Visual Basic程序设计技术满足开发需求。
对一个方阵转置,就是把原来的行号变列号,原来的列号变行号例如,如下的方阵:1 2 3 45 6 7 89 10 11 1213 14 15 16转置后变为:1 5 9 132 6 10 143 7 11 154 8 12 16但,如果是对该方阵顺时针旋转(不是转置),却是如下结果:13 9 5 114 10 6 215 11 7 316 12 8 4下面的代码实现的功能就是要把一个方阵顺时针旋转。
void rotate(int* x, int rank){int* y = (int*)malloc(___________________); // 填空for(int i=0; i<rank * rank; i++){y[_________________________] = x[i]; // 填空}for(i=0; i<rank*rank; i++){x[i] = y[i];}free(y);}int main(int argc, char* argv[]){int x[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};int rank = 4;rotate(&x[0][0], rank);for(int i=0; i<rank; i++){for(int j=0; j<rank; j++){printf("%4d", x[i][j]);}printf("\n");}return 0;}请分析代码逻辑,并推测划线处的代码。
答案写在“解答.txt”文件中注意:只写划线处应该填的内容,划线前后的内容不要抄写。
假设有两种微生物X 和YX出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍)。
一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y。
2012程序设计竞赛基础实训8239 台球碰撞在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。
有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。
受撞击后,球沿极角为b的射线(即:x正半轴逆时针旋转到此射线的角度为b)以初速度v飞出。
因球与桌面的磨擦,球作的加速度为a的匀减速率运动,每次碰到球桌边框时均发生完全弹性碰撞(反射角等于入射角)。
试求球停止时球心所在位置。
输入: l=180,w=120,x=35,y=40,r=5,b=30,v=27,a=6原题:在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。
有一个球心在(x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。
受撞击后,球沿极角为a的射线(即:x正半轴逆时针旋转到此射线的角度为a)飞出,每次碰到球桌时均发生完全弹性碰撞(球的速率不变,反射角等于入射角)。
如果球的速率为v,s个时间单位之后球心在什么地方?输入输入文件最多包含25组测试数据,每个数据仅一行,包含8个正整数L,W,x,y,R,a,v,s(100<=L,W<=105, 1<=R<=5, R<=x<=L-R, R<=y<=W-R, 0<=a<360, 1<=v,s<=105),含义见题目描述。
L=W=x=y=R=a=v=s=0表示输入结束,你的程序不应当处理这一行。
输出对于每组数据,输出仅一行,包含两个实数x, y,表明球心坐标为(x,y)。
x和y应四舍五入保留两位小数。
设计要点:(1)确定球心区域设球心座标为(x,y),则有球心矩形区域:x1≤x≤x2,y1≤y≤y2其中:x1=r,x2=l-r; y1=r,y2=w-r(2)没撞击时球位置设开始时球心位于(x0,y0),球沿极角为a的射线射出,球的速率为v,s个时间单位之后球心在(x,y):x=x0+v*s*cos(a*3.14159/180)y=y0+v*s*sin(a*3.14159/180)(3)撞击轴对称若球与右竖边(x2)撞击,撞击后横月座标为:x=2*x2-x若球与上横边(y2)撞击,撞击后纵月座标为:y=2*y2-y程序设计:// 台球碰撞#include <math.h>#include<stdio.h>void main(){double l,w,r,a,v,s,x,y,x1,x2,y1,y2;printf(" 请确定球台边框(l,w): "); scanf("%lf,%lf",&l,&w);printf(" 请确定球心开始位置(x,y): ");scanf("%lf,%lf",&x,&y);printf(" 请确定球半径r: "); scanf("%lf",&r);printf(" 请确定射击角度a: "); scanf("%lf",&a);printf(" 请确定射击速度v: "); scanf("%lf",&v);printf(" 请确定时间s: "); scanf("%lf",&s);x1=r;x2=l-r;y1=r;y2=w-r;x=x+v*s*cos(a*3.1415926/180);y=y+v*s*sin(a*3.1415926/180);while(x<x1 || x>x2 || y<y1 || y>y2){if(x>x2) x=2*x2-x;if(x<x1) x=2*x1-x;if(y>y2) y=2*y2-y;if(y<y1) y=2*y1-y;}printf(" 所求位置为:(%.2f,%.2f).\n",x,y);}请确定球台边框(l,w): 130,110请确定球心开始位置(x,y): 30,40请确定球半径r: 5请确定射击角度a: 30请确定射击速度v: 20请确定时间s: 20所求位置为:(113.59,40.00).引申:在平面直角坐标系下,台球桌是一个左下角在(0,0),右上角在(L,W)的矩形。
2012年程序设计竞赛基础实训1 2012年程序设计竞赛共6道题,注意控制了试题的难度与梯度。
第1、2题是较容易的基础题,大多数参赛者(大约70—80%)可解决。
第3题难度也不大,但比较灵活,估计20—30%参赛者可通过。
第4、5题新颖且有一定难度,预计10—15%参赛者或可求解。
第6题难度较大,主要是实现递增的循环结构难以确定,大约只有个别高手才能求解。
1 不等式对指定的正整数m ,试求满足不等式 11253321+<-++++<m n n m 的正整数n 。
输入正整数m (1<m<10000),输出正整数n 所在的区间。
例如m=2,输出正整数n 的区间为:[4,8]测试数据:(1) m=1000(2) m=2012程序设计:// 解不等式,t1#include <stdio.h>#include<math.h>void main(){ long c,d,i,m; double s;printf(" 请输入m: ");scanf("%ld",&m);i=0;s=0;while(s<m){i=i+1;s=s+sqrt(i)/(2*i-1);}c=i;while(s<m+1){i=i+1;s=s+sqrt(i)/(2*i-1);}d=i-1;printf("\n 满足不等式的正整数n 为: [%ld,%ld] \n",c,d);}数据测试:请输入m: 1000满足不等式的正整数n 为: [999550,1001549]请输入m: 2012满足不等式的正整数n 为: [4047237,4051260]变通:如果和式中增加有规律的“-”号,如何求解?实训1:解不等式nm 161514131211±+-++-+< 其中m 为从键盘输入的正整数,式中符号为二个“+”号后一个“-”号,即分母能被3整除时为“-”。
程序设计实训总结在这次的程序设计实训中,我对于程序设计有了更加深入的了解,并且取得了一定的进步。
在这100个小时的实训中,我充分发挥了自己的学习能力和解决问题的能力,通过不断学习和实践,我逐渐掌握了程序设计的基本原理和方法。
首先,在这次实训中,我学习了C语言和Python语言的基本语法,并且了解了它们的特点和用途。
通过学习这两种语言,我对于程序的运行过程、变量的使用、条件控制和循环结构等有了更加深入的理解。
我能够编写简单的程序代码,并且能够利用编程语言解决一些简单的实际问题。
其次,在实训过程中,我学习了如何使用开发工具来编写程序。
我学会了使用编译器、集成开发环境和调试器等工具来开发、调试和运行程序。
通过使用这些工具,我能够更加高效地编写程序,并且能够快速定位和解决程序中的问题。
另外,在实训中,我逐渐培养了良好的代码风格和编程习惯。
我学会了使用有意义的变量名和函数名,使用注释来解释代码的功能和实现思路,以及遵循代码缩进规范等。
这些良好的编程习惯能够提高代码的可读性和可维护性,使得程序更加易于理解和修改。
在实训的过程中,我也遇到了一些困难和挑战。
有时候,我会遇到一些难以理解的错误信息,需要通过查找资料和请教老师来解决问题。
有时候,我会遇到一些难以解决的编程问题,需要反复尝试和思考才能找到解决方法。
但是,正是这些困难和挑战,让我能够不断提高自己的编程能力和解决问题的能力。
通过这次实训,我还学习了如何进行团队合作和分工合作。
在实训中,我们组内的成员相互配合,共同完成项目任务。
我们明确分工,各司其职,通过交流和讨论来解决问题。
通过团队合作,我们能够更加高效地完成任务,并且能够从其他成员那里学习到更多有益的知识和经验。
最后,通过这次实训,我认识到程序设计是一个需要不断学习和实践的过程。
虽然我在这次实训中取得了一定的进步,但是我也意识到自己的不足之处,还有很多需要学习和提高的地方。
因此,我将继续努力学习,不断完善自己的程序设计能力。
2012年首届北京联合大学程序设计竞赛《C语言程序设计》试题考试时间:90分钟答题要求:? 将“给学生”文件夹中的“答题”文件夹复制到D盘后重命名,更名后的文件夹以参赛组号和组员姓名构成(如:C语言-T60张三、李四、王五)。
? 分别打开本组文件夹中的3个.c文件答题。
? 做题过程中请及时存盘,不要擅自重启机器,遇到死机时请找监考老师。
? 答卷完毕,关闭所有窗口,经监考教师检查后,离开考场。
? 不要关机。
1.(40分)编写程序实现如下功能:假设有一个圆心为(a,b)、半径为r的圆,其中a、b、r 从键盘输入。
输入10个点的平面坐标(x轴和y轴的坐标值),判断其中哪些点在该圆内、圆外或圆周上,并分别统计圆内、圆外或圆周上点的个数。
已知:两个点(x1,y1)和(x2,y2)间的距离s的计算公式为:s?(x2-x1)2?(y2?y1)22.(30分)下面程序的功能是计算两个49位超大整数之和,请补充完整程序。
#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 50void mycreate(int *p);void myout(int *p);void mysum(int *a,int *b,int *c);main(){ int a[N]={0},b[N]={0},c[N]={0},i=0;mycreate(a); // 产生一个49位整数,并将该数的每一位数字存放在数组a中mycreate(b); // 产生一个49位整数,并将该数的每一位数字存放在数组b中printf("第一个整数: ");myout(a); //输出a[1]至a[N-1]printf("第二个整数: ");myout(b); //输出b[1]至b[N-1]mysum(a,b,c); //计算两个49位整数之和,并将该和的每一位数字存放在数组c中printf("两个整数和:");if(c[0]!=0) //有进位时printf("%d",c[0]);else //无进位时printf(" ");myout(c); //输出c[1]至c[N-1]}// 产生一个49位整数,并将该数的每一位数字存放在p指向的数组中//函数mycreate的首部{ int i=0;。
2012程序设计竞赛基础实训7232 m位完美平方数用0,1,2,...,9能组成多少个没有重复数字的m(1<m≤10)位平方数?输入m,输出没有重复数字的m位平方数的个数,并输出其中最大数。
m=7, 输出:m=10, 输出:// 用0,1,2,...,9组成没有重复数字的m位平方数#include <math.h>#include <stdio.h>void main(){int k,m,n,t,f[10];double a,b,c,d,w,x,a1,d1;printf(" 请确定整数m: "); scanf("%d",&m);x=1.0;for(k=2;k<=m;k++) x=x*10; // 确定m位数的起点xn=0;b=(int)pow(x,0.5);c=pow(10*x-1,0.5);for(a=b+1;a<=c;a++){d=a*a; w=d; // 确保d为m位平方数for(k=0;k<=9;k++) f[k]=0;while(w>0){ t=(int)fmod(w,10);f[t]=f[t]+1;w=floor(w/10);}for(t=0,k=0;k<=9;k++)if(f[k]>1) {t=1; break;} // 测试平方数是否有重复数字if(t==0 ) // 测试平方数中没有重复数字{n++;d1=d;a1=a;}}printf(" 共可组成%d个没有重复数字的%d位平方数.",n,m);printf(" 其中最大的为:%.0f=%.0f^2 \n",d1,a1);}请确定整数m: 7共可组成123个没有重复数字的7位平方数. 其中最大的为:9872164=3142^2请确定整数m: 10共可组成87个没有重复数字的10位平方数. 其中最大的为:9814072356=99066^2变通:用0,1,2,...,9能组成没有重复数字的m(1<m≤10)位平方数的个数为s(m).问:(1)求s(10),即求出没有重复数字的10位平方数的个数。
VB程序设计第一题题目:(事件)单击窗体(响应)求50以内所有偶数的和,并在窗体上输出来。
将结果存入变量S中。
代码:Dim I As IntegerFor i = 2 To 50If (i Mod 2)=0 ThenS=s+iEnd IfNextPrint (CStr(s))第二题题目:(事件)双击窗体(响应)求s=1+1*2+1*2*3+….+1*2*3*….*10并将结果存入变量S中代码:Dim i,j As IntegerDim k As Longk=1s=0For i =1To 10For j=1 To ik=k*jNexts=s+kk=1NextPrint(CStr(s))第三题题目:(事件)单击窗体(响应)求100以内偶数的和,并将结果输出在窗体上。
将结果存入变量SUM中代码:Dim i As IntegerFor i =1 To 100If i Mod 2 =0 ThenSum=sum+iEnd IfNextPrint sum第四题题目:(事件)单击窗体(响应)编写程序求10*11*12+11*12*13+….+15*16*17的结果并将结果输出到窗体上。
将结果存入变量M中。
代码:Dim i,j As IntegerDim s As LongFor i =10 To 15s=1For j = i To i +2s=s*jNextm=m+sNextPrint (CStr(m))第五题题目:(事件)双击窗体(响应)求100以内奇数的和,并将结果输出在窗体上。
将结果存入变量SUM中。
代码:Dim i As IntegerFor i=1 To 100If i Mod 2 = 1 Thensum = sum + iEnd IfNextPrint sum第六题题目:(事件)单击窗体(响应)已知S=1+1/4+1/9+1/16+1/25+…+1/100,结果输出在窗体上代码:Dim s As SingleFor i=1 To 10a=i*iSum =1/a + SumNextPrint Sum第七题题目:(事件)双击窗体(响应)求1+1*2+1*2*3+....+1*2*3*. (10)并将结果存到变量S中代码:Dim s As Longj=1For i = 1 To 10j= j*iSum = Sum + jNextPrint Sum第八题题目:(事件)单击窗体(响应)求1—1/2+1/3—1/4+….+1/99—1/100的值。
C一、填空题(本大题两种题型,程序填空或写结果,程序填空要求每空仅填一条语句,即不能出现分号)(共40分)1、求17922和5394的最小公倍数。
(共5分)答案:答案:5555822、分解成质因数(如输出435234,251 17 17 3 2) (共5分)void prim(int m, int n){if(m>n){while(m%n != 0)n++;;;printf("%d ", n);}}void main(){int n = 435234;printf("%d,", n);prim(n, 2);}答案: m /= n; prim(m, n);3、从数字1开始向右顺时针方向移动,可以得到如下的5×5的螺旋:(共10分)21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13可以算出对角线上数字之和是101.1001×1001的螺旋中对角线上数字之和是?答案:6691710014、欧拉曾发表过一个著名的二次公式:n2+ n + 41。
这个公式对于0到39的连续数字能够产生40个质数。
但是当n=40时,402+40+41 = 40(40+1)+41能够被41整除。
当n=41时,412+41+41显然也能被41整除。
利用计算机,人们发现了一个惊人的公式:n2- 79n+1601,这个公式对于n=0到79能够产生80个质数。
这个公式的系数, -79和1601的乘积是-126479。
考虑如下形式的二次公式:n2+an+b, 其中|a|1000,|b|1000。
找出对于能够为从0开始的连续的n产生最多数量的质数的二次公式,写出该公式的系数a 和b的乘积。
答案:答案: -59231 (a = -61 b = 971 n = 70 )5、有一个整形数组a,长度为n,数组里有正数也有负数。
2012年青岛市程序设计竞赛试题(小学组)说明:1、必须以题目中规定的文件名进行保存,并用;2、比赛时间为:60分钟,试题100分;3、使用竞赛规定的文件格式输入、输出;第一题火柴盒(程序文件名a1.pas,25分);小林今年刚上一年级,最近开始学数学的加法;输入(a1.in):;第一行,三整数N,L和W用空格隔开;;接下来N行每行输入一个1到1000范围2012年青岛市程序设计竞赛试题(小学组)说明:1、必须以题目中规定的文件名进行保存,并用FTP上传到指定文件夹中,FTP上传在试题最后。
请选手没做完一道题及时上传一次,以确保因机器故障引起的文件丢失。
2、比赛时间为:60分钟,试题100分。
3、使用竞赛规定的文件格式输入、输出。
第一题火柴盒(程序文件名a1.pas,25分)小林今年刚上一年级,最近开始学数学的加法。
老师给他出了这样一道题:火柴盒长为L,宽为W(1<=L,W<=100)。
高度有一层楼这么高,火柴只能按长或宽的方式放进去,给小林了N(1<=N<=50)根火柴,知道一根火柴的长度,问有多少跟火柴可以放进该火柴盒。
你能用计算器帮小林解决这个问题吗?输入(a1.in):第一行,三整数N,L和W用空格隔开;接下来N行每行输入一个1到1000范围内的一个整数,表示火柴的长度。
输出(a1.out):一行整数,能够装进火柴盒的火柴数量。
样例1:输入:5 3 484219输出:31. program a1;varn,l,w:integer;x,count:integer;i:integer;f1,f2:text;beginassign(f1,'a1.in');assign(f2,'a1.out');reset(f1);rewrite(f2);readln(f1,n,l,w);if l<w then l:=w;for i:=1 to n dobeginreadln(f1,x);if x<=l then count:=count+1;end;writeln(f2,count);close(f1);close(f2);第二题数据统计(程序文件名a2.pas,25分)小林最近想研究末尾有0的整数的性质。
程序设计基础课程实训总结
程序设计基础课程实训是针对初学者特点,通过实践性教学,使学员掌握程序设计的基本概念、语法规则、算法分析和编程技巧。
在课程实训中,学员需要完成一定数量的编程练习和项目任务,以培养自己的分析问题、解决问题的能力。
课程实训总结如下:
1. 掌握基本概念:在实训过程中,学员需要掌握程序设计的基本概念,如变量、数据类型、运算符、控制结构等,为后续编程打下基础。
2. 熟悉语法规则:学员需要熟悉C语言或其他编程语言的语法规则,以便能够正确地编写和调试程序。
3. 学会算法分析:实训过程中,学员需要学会分析算法的复杂度,选择合适的算法解决问题,提高程序的效率和可读性。
4. 编程实践:通过完成编程练习和项目任务,学员可以将理论知识应用于实际编程中,提高自己的编程能力和动手实践能力。
5. 调试技巧:在实训过程中,学员需要掌握常用的调试技巧,如断点调试、打印调试等,以便能够快速定位并修复程序中的错误。
6. 团队协作:实训过程中,学员需要学会与团队成员进行有效沟通和协作,共同完成项目任务,提高自己的团队合作能力。
7. 总结与反思:在课程实训结束后,学员需要对自己的学习过程进行总结和反思,找出自己的不足之处,为今后的学习和工作打下坚实基础。
通过程序设计基础课程实训,学员可以在实践中掌握程序设计的基本知识和技能,为后续专业课程学习和未来职业发展奠定基础。
ioi集训2012题解IOI(国际信息学奥林匹克竞赛)是一项全球性的计算机竞赛,每年举办一次。
IOI集训是为参加IOI竞赛的选手提供的培训活动,旨在提高他们的算法和编程能力。
2012年的IOI集训题目是多样的,包含了各种难度级别的问题。
下面我将从不同角度给出一些关于IOI集训2012题解的信息。
首先,IOI集训2012题目的具体内容是不可知的,因为每年的题目都是保密的,只有参赛选手才能了解到具体的问题。
题目涵盖了算法、数据结构、图论、动态规划等各个领域,旨在考察选手的编程和解决问题的能力。
其次,对于IOI集训2012题目的解答方法,一般来说,选手需要运用各种算法和数据结构的知识,结合题目要求进行分析和设计。
他们需要考虑算法的时间和空间复杂度,以及边界情况的处理。
解题过程中,选手通常会进行思考、推导、编码和调试等步骤,直到得到正确的结果。
此外,IOI集训的题目解答方法也可能因题目的不同而有所差异。
有些问题可能需要使用贪心算法,即每一步都选择当前最优的解决方案;有些问题可能需要使用动态规划,将问题分解为子问题并利用子问题的解来求解原问题;还有一些问题可能需要使用图论算法,如最短路径算法或最小生成树算法等。
另外,IOI集训的题目解答方法还可能涉及一些特殊的技巧和思想。
例如,有些问题可以使用递归或分治法来解决;有些问题可以使用二分查找或双指针法来加速计算;还有一些问题可以使用位运算或离散数学的知识来简化计算过程。
总之,IOI集训2012题目的解答方法是多样的,需要选手具备扎实的算法和编程基础,以及良好的分析和解决问题的能力。
通过不断学习和练习,选手可以提高自己的竞赛水平,并在IOI竞赛中取得好成绩。
希望以上信息能对你了解IOI集训2012题解有所帮助。
一、实训背景随着计算机技术的飞速发展,编程已经成为现代社会不可或缺的技能。
为了提高自身的编程能力,我参加了编程基础实训课程。
通过本次实训,我对编程有了更深入的了解,以下是我对本次实训的总结报告。
二、实训目标1. 掌握编程的基本概念和原理;2. 熟悉一种编程语言(如Python);3. 学会编写简单的程序,解决实际问题;4. 提高逻辑思维和问题解决能力。
三、实训内容1. 编程基本概念在实训过程中,我学习了编程的基本概念,如变量、数据类型、运算符、控制结构等。
这些概念是编写程序的基础,对于理解程序执行过程具有重要意义。
2. 编程语言学习本次实训选择了Python语言作为学习对象。
我学习了Python的基本语法、数据结构、函数、模块等知识。
通过实际编写程序,我逐渐掌握了Python的编程技巧。
3. 算法设计与实现在实训过程中,我学习了算法的基本概念和设计方法。
通过实际案例分析,我了解了常用的算法,如排序、查找、递归等。
我将所学算法应用于实际编程中,提高了程序的性能。
4. 编程实践在实训过程中,我完成了多个编程实践项目,如计算器、学生管理系统、简易博客等。
通过这些项目,我锻炼了自己的编程能力,提高了问题解决能力。
四、实训过程1. 理论学习在实训初期,我认真学习了编程基础理论知识,为后续实践打下坚实基础。
2. 编程实践在理论学习的指导下,我开始进行编程实践。
在实践过程中,我遇到了许多困难,但在老师和同学的帮助下,我逐渐克服了这些问题。
3. 项目实践在实训后期,我参与了一个团队项目,负责编写部分功能模块。
通过团队合作,我们成功完成了项目,提高了自己的团队协作能力。
五、实训收获1. 编程能力得到提升:通过本次实训,我掌握了Python编程语言,能够独立编写简单的程序。
2. 问题解决能力提高:在实训过程中,我学会了如何分析问题、设计算法、编写代码,提高了自己的问题解决能力。
3. 团队协作能力增强:在项目实践中,我与团队成员密切配合,共同完成项目,增强了团队协作能力。
2012年程序设计竞赛基础实训221 解不等式nm 161514131211±+-++-+<其中m 为从键盘输入的正整数,式中符号为二个“+”号后一个“-”号,即分母能被3整除时为“-”。
输入正整数m ,输出满足不等式的n 。
测试数据: (1) m=4 (2) m=7设计要点1:式中出现减运算,导致不等式的解可能分段。
设置条件循环,每三项(包含二正一负)一起求和,得一个区间解。
然后回过头来一项项求和,得个别离散解。
为叙述方便,记nn s 161514131211)(±+-++-+=(1) 通过循环知s(d+1)>m ,且n=d+1为“-”,可得n=d 为一个解;而n=d+2时1.0/(n+3)为“+”,可得s(d+2)>m;以后各项中,“-”项小于其前面的“+”项,可知对于n>d+2有s(n)>m 成立。
因而有区间解:n ≥d(2) 在n<d 时是否有解,逐个求和检验确定离散解。
这一步不能省,否则出现遗解。
程序设计1:// 解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n #include <stdio.h>void main(){ long d,n,m,k; double s;printf("\n 请输入m: "); scanf("%d",&m); n=-2;s=0; while(s<=m){ n=n+3;s=s+1.0/n+1.0/(n+1)-1.0/(n+2); }d=n+1; s=0; // 可确定区间解n ≥d (1) for(k=1;k<=n;k++){ if(k%3>0) s=s+1.0/k;else s=s-1.0/k;if(s>m) printf(" n=%ld, ",k); // 逐个得离散解 }printf("n>=%ld \n",d); }程序运行示例: 请输入m: 4n=10151, n=10153, n>=10154请输入m: 7n=82273511, n=82273513, n>=82273514 注意:要特别注意,不要把离散解遗失。
思考:如果把后一个离散解写入区间解中?设计要点2:为叙述方便,记nn s 161514131211)(±+-++-+=(1) 通过循环累加,当加到s=s+1.0/n+1.0/(n+1)-1.0/(n+2);得s(n+2)>m ,令d=n+1,可知:n ≥d 为解;(2) 此时,s(n)有可能大于m,因而在原s 基础上s-1.0/d+1.0/(d+1)得s(n): 若s(n)>m,合并得区间解:n ≥d-1; 若s(n)<m,区间解为:n ≥d ;(因可肯定s(n-1)<m )但s(n-2)还有可能大于m,因而在上s 基础上s+1.0/(d-2)-1.0/(d-1),得s(n-2): 若s(n-2)>m, 得一个离散解:n =d-3;若s(n-2)<m, 没有离散解。
程序设计2:// 解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n #include <stdio.h> void main(){ long d,n,m; double s;printf("\n 请输入m: "); scanf("%d",&m); n=-2;s=0; while(s<=m){ n=n+3;s=s+1.0/n+1.0/(n+1)-1.0/(n+2); }d=n+1; // 可确定区间解n ≥d (1) s=s-1.0/d+1.0/(d+1); // 得s(n) if(s>m) printf(" n>=%ld \n",d-1); // 输出区间解 else printf(" n>=%ld \n",d);s=s+1.0/(d-2)-1.0/(d-1); // 得s(n-2)if(s>m) printf(" n=%ld \n",d-3); // 输出一个离散解 }数据测试: 请输入m: 4 n>=10153 n=10151 请输入m: 7 n>=82273513 n=82273511程序设计3:请判断以下程序是否正确?// 解不等式:m<1+1/2-1/3+1/4+1/5-1/6+...+-1/n #include <stdio.h>void main(){ double n,m,s;printf("\n 请输入m: "); scanf("%lf",&m); n=0;s=3.0/2; while(s<=m){ n=n+3;s=s-1.0/n+1.0/(n+1)+1.0/(n+2); } d=n+2;printf(" n=%.0f,",d); // 得一个离散解(1) s=s-1.0/(n+3)+1.0/(n+4);d=n+4;if(s>m) printf(" n>=%.0f\n",d); // 可确定区间解n ≥d (2) else printf(" n>=%.0f\n",d+1); // ?? }(1) 首先s(d)>m ,n=d 为一个解;而s(d-3)<=m ,n=d-2为“-”项,其绝对值大于n=d-1的“+”项,可得s(d-1)<m ;且知n<d 时无解。
同时由03121111<+-++++-n n n n ,可得s(d+1)<m ,即n=d 为一个离散解。
(2) 当s(n+4)>m 时,以后的“-”项绝对值小于其前面的“+”项,故得区间解n ≥d; 当s(n+4)<=m 时,因0514131>+++++-n n n 可知s(n+5)>m ;但不能确定s(n+6)>0,因而不能确定n ≥d+1为区间解!2 求最大值设指定区间[a,b]内的正整数x,y,z,w 满足2222w z y x =++其中a ≤x<y<z<w ≤b ,试求s=x+y+z+w 的最大值。
输入正整数a,b (1≤a<b<10000), 输出s 的最大值。
测试数据:(1) a=500,b=1000 (2) a=1000,b=2012设计要点:对每一组满足条件的解,通过比较求得最大值。
程序设计: // 求最大值#include <stdio.h> #include <math.h> void main(){long a,b,d,s,x,y,z,w,max;printf(" 请输入区间[a,b]的上下限a,b: "); scanf("%ld,%ld",&a,&b); max=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+1;y<=sqrt((b*b-x*x)/2);y++)for(z=y+1;z<=sqrt(b*b-x*x-y*y);z++){ d=x*x+y*y+z*z;w=(int)sqrt(d); // w为x,y,z的平方和开平方if(w>b) break;if(w*w==d) // 满足条件时统计{ s=x+y+z+w;if(s>max) max=s;}}printf(" s的最大值为:%ld \n",max);}数据测试:请输入区间[a,b]的上下限a,b: 500,1000s的最大值为:2728请输入区间[a,b]的上下限a,b: 1000,2012s的最大值为:54963 带中转站的交通路线在某城区的完整方格交通网中,中转站(a,b)与终点(m,n)为交通网中的任意两交叉点,这里a,b,m,n为非负整数。
试统计从始点(0,0)经中转点(a,b)到终点(m,n)的不同最短路线(路线中各段只能靠近目标点而不能远离目标点)的条数。
(注:若a>m且b>n时,从(0,0)点至(a,b)点这一段允许经过(m,n)点)交通网格示意图输入非负整数a,b,m,n,输出从始点(0,0)经(a,b)到终点(m,n)的最短路线的条数。
测试数据:(1)a=9,b=7,m=20,n=12(2)a=20,b=12,m=9,n=7设计要点:如果路线中没有设指定的必经点,从始点(0,0)到终点(m,n)每一条路线共m+n段,其中横向m段,纵向n段,每一条不同路线对应从m+n个元素中取m个元素(以放置横向段)的组合数,不同路线条数为1111+⋅⋅--+⋅+=+n m m n mm n C mn m 今设置了路线中的必经点(a,b),须分以下两步统计。
设从始点(0,0)到交叉点(a,b)的不同路线条数为y, 从交叉点(a,b)到终点(m,n)的不同路线条数为z 。
据乘法原理,从始点(0,0)经(a,b)到终点(m,n)的最短路线的条数为yz 。
为了求y,分以下两种情形计算:1) 若a=0或b=0,即必经点与起点在横向或纵向同线,y =1。
2) 若a>0且b>0,即a,b 为正整数时,y=a b a C +。
为了求z,分以下两种情形计算:1) 若m=a 或n=b ,即必经点与终点在横向或纵向同线,z =1。
2) 若m ≠a 且n ≠b ,必经点与终点在横向相差a m -,在纵向相差b n -,z=am b n a m C --+-。
程序设计:// 带中转站的最短路线 #include <stdio.h> #include <math.h> void main(){ double a,b,c,d,m,n,k,y,z;printf(" 请输入正整数a,b: "); scanf("%lf,%lf",&a,&b); printf(" 请输入正整数m,n: "); scanf("%lf,%lf",&m,&n); y=1; if(a*b>0)for(k=1;k<=a;k++)y=y*(b+k)/k; // 计算C(a+b,a) z=1;if((m-a)*(n-b)!=0){ c=fabs(m-a);d=fabs(n-b); for(k=1;k<=c;k++)z=z*(d+k)/k; // 计算C(|m-a|+|n-b|,|m-a|) }printf(" 不同最短路线条数为: %.0f \n",y*z); }数据测试:请输入正整数a,b: 9,7 请输入正整数m,n: 20,12 不同最短路线条数为: 49969920 请输入正整数a,b: 20,12 请输入正整数m,n: 9,7不同最短路线条数为: 986263125120附无障碍无中转站的交通路线问题程序: // 无障碍完整交通路线问题#include <stdio.h>void main(){ int k,m,n,x,y,z,f[50][50];printf(" 请输入正整数m,n: "); scanf("%d,%d",&m,&n);for(x=1;x<=m;x++) f[x][0]=1;for(y=1;y<=n;y++) f[0][y]=1; // 确定边界条件for(x=1;x<=m;x++)for(y=1;y<=n;y++) // 实施递推得目标值f(m,n)f[x][y]=f[x-1][y]+f[x][y-1];printf(" 不同最短路线条数为: %d \n",f[m][n]);z=1;for(k=1;k<=m;k++)z=z*(n+k)/k;printf(" 不同最短路线组合数为: %d \n",z);}请输入正整数m,n: 7,10不同最短路线条数为: 194484 双码二部数序列试求双码二部数升序序列的第m项。