ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:29.28KB ,
资源ID:8781160      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8781160.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序设计竞赛基础实训81.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

程序设计竞赛基础实训81.docx

1、程序设计竞赛基础实训812012程序设计竞赛基础实训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),右上角在

2、(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=a360, 1=v,s=105),含义见题目描述。L=W=x=y=R=a=v=s=0表示输入结束,你的程序不应当处理这一行。输出对

3、于每组数据,输出仅一行,包含两个实数x, y,表明球心坐标为(x,y)。x和y应四舍五入保留两位小数。样例输入样例输出100 100 80 10 5 90 2 23110 100 70 10 5 180 1 99990 0 0 0 0 0 0 080.00 56.0071.00 10.00设计要点:(1) 确定球心区域设球心座标为(x,y),则有球心矩形区域:x1xx2,y1yy2其中: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.

4、14159/180) y=y0+v*s*sin(a*3.14159/180)(3) 撞击轴对称若球与右竖边(x2)撞击,撞击后横月座标为:x=2*x2-x若球与上横边(y2)撞击,撞击后纵月座标为:y=2*y2-y 程序设计:/ 台球碰撞 #include #includevoid 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: );

5、 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(xx2 | yy2) if(xx2) x=2*x2-x; if(xy2) y=2*y2-y; if(yy1) y=2*y1-y; printf( 所求位置为:(%.2f,%.

6、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)的矩形。有一个球心在(x,y),半径为r的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为b的射线(即:与正半轴逆时针旋转到此射线的角度为b)以初速度v飞出。因球与桌面的磨擦,球作的加速度为a的匀减速率运动,每次碰到球桌边框时均发生完全弹性碰撞(反射角等于入

7、射角)。试求球停止时球心所在位置。解:球作的初速度为v0,加速度为a的匀减速率运动,设t时刻球的速度为vt,则vt=v0-a*t停止时vt=0,则运行时间为:t=v0/a球运行距离为s=v0*t-a*t*t/2=v0*v0/2/a/ 台球碰撞 #include #includevoid main() double l,w,r,a,b,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

8、: ); scanf(%lf,&r); printf( 请确定射击角度b: ); scanf(%lf,&b); printf( 请确定射击初速度v: ); scanf(%lf,&v); printf( 请确定匀减速的加速度a: ); scanf(%lf,&a); x1=r;x2=l-r;y1=r;y2=w-r; s= v*v/2/a; x=x+s*cos(b*3.1415926/180); y=y+s*sin(b*3.1415926/180); while(xx2 | yy2) if(xx2) x=2*x2-x; if(xy2) y=2*y2-y; if(y1),求出其平方数s;计算a的位数w

9、,同时计算b=10w,a的平方s的尾部c=s%b;比较a,c,若a=c则输出守形数。(2) 程序实现/ 求x,y内的守形数 #includevoid main()long int a,b,c,k,s,x,y; printf( 求区间x,y中的守形数.); printf( 请输入整数x,y:); scanf(%ld,%ld,&x,&y); for(a=x;a0) b=b*10;k=k/10; c=s%b; / c为a的平方数s的尾部 if(a=c) printf(%ld2=%ld n,a,s); (3) 程序运行结果求区间x,y中的守形数.请输入整数x,y:10,10000252=625762=

10、57763762=1413766252=39062593762=87909376 2. 探索n位守形数 (1) 求解要点为了求更多位数的守形数,可应用守形数的性质:一个m位守形数的尾部m-1位数也是一个守形数。道理很简单,a是一个m位数,a的平方数尾部的m-1位仅由a的尾部m-1位决定而与a的其他位无关。 实施易知一位守形数有三个:1,5,6。则二位守形数的个位数字只可能是1,5,6这三个数字。根据这一思路,我们可应用递推求出多位守形数。(2) 程序设计/ 求n位守形数 #includevoid main() int n,d,k,j,i,t,m,w,z,u,v,a500,b500,c500;

11、printf(n=);scanf(%d,&n); for(d=1;d=9;d+) for(k=1;k=500;k+) ak=0;bk=0;ck=0; a1=d; / 给个位数赋值 for(k=2;k=n;k+) for(j=0;j=9;j+) ak=j;v=0; for(i=1;i=k;i+) ci=0; / 探索a(k) for(i=1;i=k;i+) for(z=0,t=1;t=k;t+) u=ai*at+z;z=u/10;bi+t-1=u%10; / 计算平方 for(w=0,m=i;m=k;m+) u=cm+bm+w;w=u/10;cm=u%10; for(i=1;i=1;k-) pr

12、intf(%d,ak);printf(n); (3) 程序运行示例运行程序, 输入n=30,得30位守形数 5结尾的30守形数: 106619977392256259918212890625 6结尾的30守形数: 89338002260774374008178710937641 奇数序列运算式在由指定相连奇数组成的序列的每相邻两项中插入运算符号:若相邻两项都是合数,则两项中插入“-”号;若相邻两项一项合数一项素数,则两项中插入“+”号;若相邻两项都是素数,则两项中插入乘号“*”号;输入奇数b,c(bc),完成b,c中奇数序列的运算式,并计算该式的运算结果。例如b=31,c=45,完成运算式为:

13、 31+33-35+37+39+41*43+45=1913测试数据: (1) b=3,c=51 (2) b=2011,c=2029/ 奇数序列运算式#define N 30000#include #include void main()int b,c,f,m,n,k,i,j,aN; long t,s; printf( 请输入首尾奇数b,c(bc): ); scanf(%d,%d,&b,&c);m=b-2;n=(c-m)/2; / 奇数序列2k+m (k=1,2.,n) for(k=1;k=n+1;k+) ak=0;for(k=1;k=n;k+) for(t=0,j=3;j=sqrt(2*k+m

14、);j+=2) if(2*k+m)%j=0) t=1;break; if(t=0) ak=1; / 标记第k个奇数2k+m为素数 printf(n %d,b);for(i=2;i=n;i+) / 完成表达式 if(ai-1+ai=0) printf(-%d,2*i+m); / 插入减号 if(ai-1+ai=1) printf(+%d,2*i+m); / 插入加号 if(ai-1+ai=2) printf(*%d,2*i+m); / 插入乘号 s=0; a0=1-a1; an+1=0;for(i=1;i=n;i+) / 计算表达式结果 t=2*i+m;f=i; while(ai+ai+1=2)

15、 i+;t=t*(2*i+m); / 相邻项均为素数时相乘if(af-1+af=0) s=s-t;if(af-1+af=1) s=s+t; printf(=%d.n,s); 请输入首尾奇数b,c(bc): 3,99 12857请输入首尾奇数b,c(bc): 2001,2029 411475242 构建旋转方阵把整数1,2,.,n2 从外层至中心按顺时针方向螺旋排列所成的nn方阵,称顺转n阶方阵;按逆时针方向螺旋排列所成的称逆转n阶方阵。1 24 23 22 21 20 19 2 25 40 39 38 37 18 3 26 41 48 47 36 17 4 27 42 49 46 35 16

16、5 28 43 44 45 34 15 6 29 30 31 32 33 14 7 8 9 10 11 12 13上图为逆转7阶方阵。 设计程序选择分别打印逆转10阶方阵与顺转15阶方阵。(1) 设计要点打印二种旋转方阵关键在于数组元素的赋值以及赋值与打印的巧妙结合。 对应方阵的n行n列设置二维数组a(n,n)。令m=int(n/2),当n为偶数时,方阵共m圈。当n为奇数时,方阵除m圈外正中间还有一个数a(m+1,m+1)=n*n。对于m圈,每圈有上下左右四条边。最外圈定义为第1圈,从外往内依次定义为第2圈,.第i圈每边有n-2i+1个数。为了实现旋转准确对各圈各边的每一个数组元素赋值,我们引

17、入中间变量s,t:s=n-2i+1t=t+4s (t置初值0)设置i(1m)循环对第i圈操作,设置j(in-i)循环对第i圈的四条边的n-2i+1个元素操作。i,j二重循环可对方阵的每一元素赋值。在顺时针转方阵中,具体赋值为: 上行为a(i,j)=t+1-i+j:其中+j体现往右元素值递增1;+t-i体现随圈数i增加数值增加值;而1为具体调整数。 右列为a(j,n+1-i)=t+s+1+j-i,即在a(i,j)的基础上增s。 下行为a(n+1-i,j+1)=t+3*s-j+i:其中-j体现往左元素值递增1;+t+i体现随圈数i增加数值增加值;而3*s为具体调整数。 左列为a(j+1,i)=t+

18、4*s-j+i,即在a(n+1-i,j+1)基础上增s。 在逆时针转方阵中,还是上述赋值,只是打印输出时把行列互换。这样处理是巧妙的,较为简便。(2) 程序实现/ 旋转方阵 #include #include void main()int i,j,m,n,t,s,z,a2020; printf( 输入方阵阶n:); scanf(%d,&n); printf( 方阵有以下两种旋转方式:n); printf( 1: 逆时针转 2: 顺时针转n); printf( 选择旋转方式代码: ); scanf(%d,&z); m=n/2;t=0; am+1m+1=n*n; for(i=1;i=m;i+) /

19、 按规律给a数组赋值 s=n+1-2*i; for(j=i;j=n-i;j+) aij=t+1-i+j; ajn+1-i=t+s+1+j-i; an+1-ij+1=t+3*s-j+i; aj+1i=t+4*s-j+i; t=t+4*s; printf( 所求旋转方阵为:); for(i=1;i=n;i+) printf(n); for(j=1;j=n;j+) / 按座标输出方阵 if(z%2=0) printf(%4d,aij); else printf(%4d,aji); (3) 程序运行示例与变通输入方阵阶n:7 方阵有以下两种旋转方式: 1: 逆时针转 2: 顺时针转 选择旋转方式代码:

20、 1 所求旋转方阵为: 1 24 23 22 21 20 19 2 25 40 39 38 37 18 3 26 41 48 47 36 17 4 27 42 49 46 35 16 5 28 43 44 45 34 15 6 29 30 31 32 33 14 7 8 9 10 11 12 13输入方阵阶n:8 方阵有以下两种旋转方式: 1: 逆时针转 2: 顺时针转 选择旋转方式代码: 2 所求旋转方阵为: 1 2 3 4 5 6 7 8 28 29 30 31 32 33 34 9 27 48 49 50 51 52 35 10 26 47 60 61 62 53 36 11 25 46

21、 59 64 63 54 37 12 24 45 58 57 56 55 38 13 23 44 43 42 41 40 39 14 22 21 20 19 18 17 16 15 程序变通:把程序中的输出量aij 改变为n*n-aij+1,可输出由内到外的旋转方阵。43 n!精确计算定义n!=1*2*3*n输入正整数n(=100),精确计算并输出n!(若大于10位时输出其高10位)测试数据:n=30n=10044 分数数列老师为了检测学生的观察分析能力与程序设计水平,写出一个递推分数数列的前6项: 1/2, 3/5, 4/7, 6/10, 8/13, 9/15, .,引导学生注意观察数列的构成规律:第i项的分母d与分子c存在以下关系:d=c+i.而c为与前i-1项中的所有分子、分母均不相同的最小正整数。试求出该数列的第n项,并求出前n项中的最大项。测试数据:(1) n=1000(2) n=2012 45 双和数组把一个偶数2s分解为6个互不相等的正整数a,b,c,d,e,f,然后把这6个正整数分成(a,b,c)与(d,e,f)两个组,若这两组数具有以下两个相等特性: 则把数组(a,b,c)与(d,e,f)称为基于s 的双和数组(约定abc,def,ad)。1) 存在双和数组, s至少为多大?2) 当s=98时有多少个不同的双和数组?

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1