程序设计竞赛基础实训 .docx
精品名师归纳总结2021 程序设计竞赛基础实训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 组测试数据,每个数据仅一行,包含L, W, x, y, R, a, v, s( 100<=L, W<=105,1<=R<=5,R<=x<=L- R,8 个正整数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 ,说明球心 坐标为样例输入100 100 80 10 5 90 2 23110 100 70 10 5 180 1 99990 0 0 0 0 0 0 0样例输出80.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*cosa*3.14159/180 y=y0+v*s*sina*3.14159/180( 3) 撞击轴对称如球与右竖边( x2)撞击,撞击后横月座标为:x=2*x2-x如球与上横边( y2)撞击,撞击后纵月座标为:y=2*y2-y可编辑资料 - - - 欢迎下载精品名师归纳总结程序设计:/台球碰撞#include <math.h> #include<stdio.h> void maindouble 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*cosa*3.1415926/180。y=y+v*s*sina*3.1415926/180。whilex<x1 | x>x2 | y<y1 | y>y2ifx>x2 x=2*x2-x。ifx<x1 x=2*x1-x。ify>y2 y=2*y2-y。ify<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 的矩形。有一个球心在 x, y ,半径为 r的圆形母球放在台球桌上(整个球都 在台球桌内)。受撞击后,球沿极角为b 的射线(即:与正半轴逆时针旋转到此射线的角度为 b)以初速度 v 飞出。因球与桌面的磨擦,球作的加速度为a 的匀减速率运动,每次遇到球桌边框时均发生完全弹性碰撞(反射角等于入射角)。试求球停止时球心所在位置。解:球作的初速度为 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 <math.h> #include<stdio.h> void maindouble 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: "。 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*cosb*3.1415926/180。y=y+s*sinb*3.1415926/180。whilex<x1 | x>x2 | y<y1 | y>y2ifx>x2 x=2*x2-x。ifx<x1 x=2*x1-x。ify>y2 y=2*y2-y。ify<y1 y=2*y1-y。printf"球停止时球心所求位置为 :%.2f,%.2f.n",x,y。请确定球台边框 l,w: 180,120请确定球心开头位置 x,y: 35,40请确定球半径 r: 5请确定射击角度 b: 30请确定射击初速度 v: 27请确定匀减速的加速度 a: 6球停止时球心所求位置为 :87.61,70.37.40 守形数如正整数 n 是它平方数的尾部,就称 n 为守形数,又称同构数。例如, 6 是其平方数 36 的尾部 ,.76 是其平方数 5776 的尾部, 6 与 76 都是守形数。可编辑资料 - - - 欢迎下载精品名师归纳总结试求出指定区间 x,y内全部守形数。测试数据:(1) x=10,y=10000,输出:(2) x=10000,y=1000000, 输出:1. 常规求解(1设计要点对指定范畴 x,y内的每一个整数 a(商定 a>1),求出其平方数 s。 运算 a 的位数 w,同时运算 b=10w, a 的平方 s 的尾部 c=s%b。比较 a, c,如 a=c 就输出守形数。(2) 程序实现/求x,y内的守形数#include<stdio.h> void mainlong int a,b,c,k,s,x,y。printf"求区间x,y中的守形数 ." 。printf"请输入整数 x,y:"。scanf"%ld,%ld",&x,&y。fora=x。a<=y。a+ s=a*a。/运算 a 的平方数 s b=1。k=a。whilek>0b=b*10。k=k/10 。c=s%b。/ c为 a 的平方数 s 的尾部ifa=cprintf"%ld2=%ld n",a,s。(3) 程序运行结果求区间x,y中的守形数 . 请输入整数 x,y:10,10000 252=625762=57763762=1413766252=39062593762=879093762. 探究 n 位守形数(1求解要点为了求更多位数的守形数,可应用守形数的性质:一个m 位守形数的尾部m-1 位数也是一个守形数。道理很简洁, a 是一个 m位数, a 的平方数尾部的 m-1 位仅由 a 的尾部 m-1位打算而与 a 的其他位无关。实施易知一位守形数有三个:1,5,6 。就二位守形数的个位数字只可能是1,5,6这三个数字。依据这一思路,我们可应用递推求出多位守形数。(2程序设计可编辑资料 - - - 欢迎下载精品名师归纳总结/ 求 n 位守形数#include<stdio.h> void main int n,d,k,j,i,t,m,w,z,u,v,a500,b500,c500。printf"n="。scanf"%d",&n。ford=1。d<=9。d+fork=1。k<=500。k+ak=0。bk=0 。ck=0 。a1=d。/给个位数赋值fork=2。k<=n。k+forj=0。j<=9 。j+ak=j。v=0。fori=1。i<=k 。i+ ci=0。 /探究 ak fori=1。i<=k 。i+forz=0,t=1。t<=k 。t+u=ai*at+z。z=u/10 。bi+t-1=u%10。/运算平方forw=0,m=i。m<=k。m+u=cm+bm+w。w=u/10。cm=u%10。fori=1。i<=k 。i+ ifai.=ci v=1。ifv=0 break。ifv=0 && an.=0/输出 n 位守形数结果printf" %d结尾的 %d守形数 : ",a1,n。fork=n。k>=1。k- printf"%d",ak。printf"n"。( 3) 程序运行示例运行程序, 输入 n=30,得 30 位守形数5结尾的 30 守形数 : 10661997739225625996结尾的 30 守形数 : 89338002260774374008178710937641 奇数序列运算式在由指定相连奇数 组成的序列的每相邻两项中插入运算符号:可编辑资料 - - - 欢迎下载精品名师归纳总结如相邻两项都是合数,就两项中插入“- ”号。如相邻两项一项合数一项素数,就两项中插入“+”号。 如相邻两项都是素数,就两项中插入乘号“* ”号。输入奇数 b,cb<c ,完成 b,c中奇数序列的运算式,并运算该式的运算结果。例如 b=31,c=45, 完成运算式为: 31+33-35+37+39+41*43+45=1913测试数据:1 b=3,c=512 b=2021,c=2029/奇数序列运算式#define N 30000 #include <stdio.h> #include <math.h>void mainint b,c,f,m,n,k,i,j,aN。 long t,s。printf"请输入首尾奇数 b,cb<c: "。 scanf"%d,%d",&b,&c。m=b-2。n=c-m/2 。/奇数序列 2k+m k=1,2.,n fork=1。k<=n+1。k+ ak=0。fork=1 。k<=n。k+ fort=0,j=3。j<=sqrt2*k+m。j+=2 if2*k+m%j=0 t=1。break 。ift=0 ak=1。/标记第 k 个奇数 2k+m为素数printf"n %d",b。fori=2。i<=n 。i+/完成表达式ifai-1+ai=0 printf"-%d",2*i+m。/插入减号ifai-1+ai=1 printf"+%d",2*i+m。/插入加号ifai-1+ai=2 printf"*%d",2*i+m。/插入乘号s=0。 a0=1-a1。 an+1=0 。fori=1。i<=n 。i+/运算表达式结果 t=2*i+m。f=i 。whileai+ai+1=2i+。t=t*2*i+m。/相邻项均为素数时相乘ifaf-1+af=0 s=s-t。ifaf-1+af=1 s=s+t。printf"=%d.n",s。请输入首尾奇数 b,cb<c: 3,9912857请输入首尾奇数 b,cb<c: 2001,2029可编辑资料 - - - 欢迎下载精品名师归纳总结411475242 构建旋转方阵2把整数 1,2,., n 从外层至中心按顺时针方向螺旋排列所成的n×n 方阵,. 称顺转 n 阶方阵。按逆时针方向螺旋排列所成的称逆转n 阶方阵。1 24 23 22 21 20 192 25 40 39 38 37 183 26 41 48 47 36 174 27 42 49 46 35 165 28 43 44 45 34 156 29 30 31 32 33 14789 10 11 12 13上图为逆转 7 阶方阵。设计程序挑选分别打印逆转 10 阶方阵与顺转 15 阶方阵。(1) 设计要点打印二种旋转方阵关键在于数组元素的赋值以及赋值与打印的奇妙结合。对应方阵的 n 行 n 列设置二维数组 an,n 。令 m=intn/2 ,当 n 为偶数时 ., 方 阵共 m 圈。 当 n 为奇数时 , 方 阵除 m 圈外正中间仍 有一 个数am+1,m+1=n*n。对于 m圈,每圈有上下左右四条边。最外圈定义为第 1 圈, 从外往内依次定义为第 2 圈, . 第 i 圈每边有 n-2i+1 个数。为了实现旋转精确对各圈各边的每一个数组元素赋值,我们引入中间变量可编辑资料 - - - 欢迎下载精品名师归纳总结s,t:s=n-2i+1t=t+4s t置初值 0设置 i1 m循环对第 i 圈操作, 设置 jin-i循环对第 i 圈的四条边的可编辑资料 - - - 欢迎下载精品名师归纳总结n-2i+1个元素操作。 i,j二重循环可对方阵的每一元素赋值。在顺时针转方阵中 , 详细赋值为 :上行为 ai,j=t+1-i+j:其中+j表达往右元素值递增 1。+t-i表达随圈数 i 增加数值增加值。而 1 为详细调整数。右列为 aj,n+1-i=t+s+1+j-i,即在 ai,j的基础上增 s。下行为 an+1-i,j+1=t+3*s-j+i:其中 -j表达往左元素值递增 1。+t+i.表达随圈数 i 增加数值增加值。而 3*s 为详细调整数。左列为 aj+1,i=t+4*s-j+i,即在 an+1-i,j+1基础上增 s。在逆时针转方阵中,仍是上述赋值,只是打印输出时把行列互换。这样处理是奇妙的,较为简便。(2) 程序实现/旋转方阵#include <math.h>可编辑资料 - - - 欢迎下载精品名师归纳总结#include <stdio.h> void mainint 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 。fori=1。i<=m。i+/按规律给 a 数组赋值s=n+1-2*i。forj=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"所求旋转方阵为:"。fori=1。i<=n 。i+printf"n"。forj=1。j<=n 。j+/按座标输出方阵ifz%2=0printf"%4d",aij。elseprintf"%4d",aji。(3) 程序运行示例与变通输入方阵阶 n:7方阵有以下两种旋转方式 : 1:逆时针转 2:顺时针转挑选旋转方式代码 : 1所求旋转方阵为:可编辑资料 - - - 欢迎下载精品名师归纳总结输入方阵阶 n:81 24 23 22 21 20 192 25 40 39 38 37 183 26 41 48 47 36 174 27 42 49 46 35 165 28 43 44 45 34 156 29 30 31 32 33 14789 10 11 12 13可编辑资料 - - - 欢迎下载精品名师归纳总结方阵有以下两种旋转方式 : 1:逆时针转 2:顺时针转挑选旋转方式代码 : 2所求旋转方阵为 :1234567828 29 30 31 32 33 34927 48 49 50 51 52 35 1026 47 60 61 62 53 36 1125 46 59 64 63 54 37 1224 45 58 57 56 55 38 1323 44 43 42 41 40 39 1422 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=30 n=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=10002 n=202145 双和数组把一个偶数 2s 分解为 6 个互不相等的正整数a,b,c,d,e,f,然后把这 6 个可编辑资料 - - - 欢迎下载精品名师归纳总结正整数分成 a,b,c与d,e,f两个组,如这两组数具有以下两个相等特性:bcdef 1111a11abcdef就 把 数 组 a,b,c与 d,e,f称 为 基 于 s的 双 和 数 组 约 定a<b<c,d<e<f,a<d )。1) 存在双和数组 , s至少为多大?2) 当 s=98 时有多少个不同的双和数组 .可编辑资料 - - - 欢迎下载