《2022年程序设计大赛题目解答 .pdf》由会员分享,可在线阅读,更多相关《2022年程序设计大赛题目解答 .pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、程序设计大赛题目解答1. 求代数和设 n 为正整数,求和式中各项符号为二正一负,分母符号为一正一负。正整数 n 从键盘输入,输出和s 四舍五入精确到小数点后5 位。输入 n=100 输出:输入 n=2011 输出:/ 求代数和#include #include void main() long j,n; double ts,s; printf( 请输入 n: ); scanf(%d,&n); j=0;ts=0;s=0; while(jn) j=j+1; if(j%2=0) ts=ts-(double)1/j; / ts为各项的分母 else ts=ts+(double)1/j; if(j%3=
2、0) s=s-sqrt(j)/ts; / 求代数和s else s=s+sqrt(j)/ts; printf( s=%.5f n,s); 请输入 n: 100 s=324.74013 请输入 n: 2011 s=28924.48725 变通:设 2n2011, 当 n 为何值时,和s 最接近 2011?#include #include void main() int n,n1=1; double sum1=1,sum2=1,g; printf( 请输入 n:); scanf(%d,&n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
3、- - - 名师精心整理 - - - - - - - 第 1 页,共 25 页 - - - - - - - - - while(n11 ,说明原a 有 2,3 以外的因数,不属于该序列。若 j=1 ,说明原a 只有 2,3 的因数,属于该序列,把a 赋值给序列第k 项。由于实施从小到大测试赋值,所得项无疑是从小到大的序列。当 a 达到指定的n,退出循环,输出指定项f(m) 。(2) 枚举程序设计/ 幂序列 2x*3y 枚举求解#include void main() int k,m; long a,j,n,f1000; printf( 计算不大于n 的项数,请指定n: ); scanf(%ld
4、,&n); printf( 输出序列的第m项,请指定m: ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 25 页 - - - - - - - - - scanf(%d,&m); f1=1;f2=2;k=2; for(a=3;a=n;a+) j=a; while(j%2=0) j=j/2; / 反复用 2 试商 while(j%3=0) j=j/3; / 反复用 3 试商if(j=1) k+;fk=a; / 用 a 给 fk赋值 printf( 幂序列中不大于%ld
5、 的项数为: %dn,n,k); if(m=k) printf( 从小到大排序的第%d项为: %ldn,m,fm); else printf( 所输序号m大于序列的项数!n); (3) 程序运行示例n=10000,m=50 输出: 67 , 2304 n=10000000,m=100 输出: 190, 93312 变通:计算集合在指定区间n1,n2中有多少个元素?3. 喝汽水定价 1 瓶汽水 4 角 8 分钱,同时规定3个空瓶可换回1 瓶汽水,或20 个空瓶可换回7瓶汽水。例如用 5 元买 10 瓶汽水,然后用9 个空瓶子换3 瓶汽水,喝掉3 瓶满的,喝完以后4个空瓶子, 用 3 个再换一瓶,
6、喝掉这瓶满的,这时候剩2 个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3 个空瓶子换一瓶满的还给老板。这样,5 元可喝到15 瓶汽水。今有 n 元钱买汽水,最多可喝m瓶汽水。n=100, m= n=2011,m= #include void main() int n1=2011,n,sum,i; double n2; n2=n1/0.48; n=n2; sum=n; while(n20) i=n/20; sum+=i*7; n=i*7+n%20; while(n=2) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - -
7、- - 名师精心整理 - - - - - - - 第 3 页,共 25 页 - - - - - - - - - i=n/3; sum+=i; n=i+n%3; if(n=2) sum+;break; printf(%dn,sum); 原题:有这样一道智力题: “某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是 5 瓶,方法如下: 先用 9 个空瓶子换3瓶汽水,喝掉3 瓶满的,喝完以后4 个空瓶子,用3 个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。 然后你让老板先借给你一瓶汽水,喝掉这瓶满的, 喝完以后用3 个空瓶子换一瓶满的还给老板。如果小张
8、手上有n个空汽水瓶,最多可以换多少瓶汽水喝?/ 规定 3 个空瓶可换回1 瓶汽水。开始有n 个空瓶,最多可喝多少瓶汽水?#include void main() long n,m,t,x; printf( 请输入开始拥有的空瓶数n:); scanf(%ld,&n); t=n;m=0; / 确定初始值while(t=3) x=t/3;m=m+x; / 用 3x 个空瓶换回x 瓶汽水t=t-2*x; / 空瓶数减少2x 个printf( 用其中 %ld 个空瓶换回 %ld 瓶汽水。 ,3*x,x); printf(喝完后空瓶个数变为%ld.n,t); if(t=2) m=m+1; printf(
9、借 1 瓶汽水,再还3空瓶,两清 .n); printf( 答案:开始有 %ld 个空瓶,可喝 %ld 瓶汽水。 n,n,m); 请输入开始拥有的空瓶数n:2012 用其中 2010 个空瓶换回670 瓶汽水。喝完后空瓶个数变为672. 用其中 672 个空瓶换回224 瓶汽水。喝完后空瓶个数变为224. 用其中 222 个空瓶换回74 瓶汽水。喝完后空瓶个数变为76. 用其中 75 个空瓶换回25 瓶汽水。喝完后空瓶个数变为26. 用其中 24 个空瓶换回8 瓶汽水。喝完后空瓶个数变为10. 用其中 9 个空瓶换回3 瓶汽水。喝完后空瓶个数变为4. 用其中 3 个空瓶换回1 瓶汽水。喝完后空
10、瓶个数变为2. 借 1 瓶汽水,再还3 空瓶,两清 . 答案:开始有2012 个空瓶,可喝1006 瓶汽水。解: 因 7/201/3,因此只要空瓶数大于等于20, 尽可能用20 个空瓶可换回7 瓶汽水。直到空瓶数不足20 时,用 3 个空瓶可换回1 瓶汽水。由 20空瓶 =7汽水 +7空瓶名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 25 页 - - - - - - - - - 得 1空瓶 =7/13 汽水由 3空瓶 =1 汽水 +1 空瓶得 1空瓶 =1/2 汽水设置
11、变量 k 统计汽水瓶数,t 统计空瓶数。/ 规定 1 瓶汽水 48 分钱,今有n 元钱 ; 规定 3 个空瓶可换回1 瓶汽水,/ 或 20 个空瓶可换回7 瓶汽水。问最多可喝多少瓶汽水?#include void main() long k,n,t,x; printf( 请输入 n:); scanf(%ld,&n); k=n*100/48; t=k; / k为汽水瓶数, t 为空瓶数printf( 有 %ld元钱 , 可买回 %ld 瓶汽水。 ,n,k); if(n*100k*48) printf( 尚余 %ld 分钱。 ,n*100-k*48); printf(n 喝完 %ld 瓶汽水后,空
12、瓶按以下方案换回汽水:n,k); while(t=20) x=t/20;k=k+7*x; / 用 20 x 个空瓶换回7x 瓶汽水t=t-13*x; / 空瓶数减少13x 个printf( 用其中 %ld 个空瓶换回 %ld 瓶汽水。 ,20*x,7*x); printf(喝完后空瓶个数变为%ld.n,t); if(t=13) k=k+7;t=t-13; printf( 借 7 瓶汽水 , 再还 20 空瓶 , 空瓶个数变为 %ld.n,t); while(t=3) x=t/3;k=k+x; / 用 3x 个空瓶换回x 瓶汽水t=t-2*x; / 空瓶数减少2x 个printf( 用其中 %l
13、d 个空瓶换回 %ld 瓶汽水。 ,3*x,x); printf(喝完后空瓶个数变为%ld.n,t); if(t=2) k=k+1; printf( 借 1 瓶汽水,再还3空瓶 .n); printf( 答案:有 %ld 元钱,最多可喝%ld 瓶汽水。 n,n,k); 请输入 n:100 有 100 元钱 ,可买回 208 瓶汽水。尚余 16 分钱。喝完 208 瓶汽水后,空瓶按以下方案换回汽水:用其中 200 个空瓶换回70 瓶汽水。喝完后空瓶个数变为78. 用其中 60 个空瓶换回21 瓶汽水。喝完后空瓶个数变为39. 用其中 20 个空瓶换回7 瓶汽水。喝完后空瓶个数变为26. 用其中
14、20 个空瓶换回7 瓶汽水。喝完后空瓶个数变为13. 借 7 瓶汽水 , 再还 20 空瓶 , 空瓶个数变为0. 答案:有100 元钱,最多可喝320 瓶汽水。请输入 n:2011 有 2011 元钱 , 可买回 4189 瓶汽水。尚余 28 分钱。喝完 4189 瓶汽水后,空瓶按以下方案换回汽水:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 25 页 - - - - - - - - - 用其中 4180 个空瓶换回1463 瓶汽水。喝完后空瓶个数变为147 用其中 1
15、460 个空瓶换回511 瓶汽水。喝完后空瓶个数变为523. 用其中 520 个空瓶换回182 瓶汽水。喝完后空瓶个数变为185. 用其中 180 个空瓶换回63 瓶汽水。喝完后空瓶个数变为68. 用其中 60 个空瓶换回21 瓶汽水。喝完后空瓶个数变为29. 用其中 20 个空瓶换回7 瓶汽水。喝完后空瓶个数变为16. 借 7 瓶汽水 , 再还 20 空瓶 , 空瓶个数变为3. 用其中 3 个空瓶换回1 瓶汽水。喝完后空瓶个数变为1. 答案:有2011 元钱,最多可喝6444 瓶汽水。省去过程,简化设计:/ 规定 1 瓶汽水 48 分钱,今有n 元钱 ; 规定 3 个空瓶可换回1 瓶汽水,/
16、 或 20 个空瓶可换回7 瓶汽水。问最多可喝多少瓶汽水?#include void main() long k,n,t,x; printf( 请输入 n:); scanf(%ld,&n); k=n*100/48; t=k; / k为汽水瓶数, t 为空瓶数x=t/13;k=k+7*x; / 实现 1 空瓶 =7/13 瓶汽水t=t-13*x; / 空瓶数减少13x 个x=t/2;k=k+x; / 实现 1 空瓶 =1/2 瓶汽水printf( 答案: %ld 元钱最多可喝 %ld 瓶汽水。 n,n,k); 请输入 n:100 答案: 100 元钱最多可喝320 瓶汽水。请输入 n:2011
17、答案: 2011 元钱最多可喝6444 瓶汽水。4. 解佩尔方程1. 案例背景佩尔 (Pell)方程是关于x,y 的二次不定方程,表述为(其中 n 为非平方正整数)当 x=1 或 x=-1 ,y=0 时,显然满足方程。常把x,y 中有一个为零的解称为平凡解。?我们要求佩尔方程的非平凡解。佩尔方程的非平凡解很多,这里只要求出它的最小解,即x,y? 为满足方程的最小正数的解,又称基本解。对于有些 n,尽管是求基本解,其数值也大得惊人。这么大的数值,如何求得?其基本解具体为多少?可以说,这是自然界对人类计算能力的一个挑战。十七世纪曾有一位印度数学家说过,要是有人能在一年的时间内求出x2-92y2=1
18、 的非平凡解,他就算得上一名真正的数学家。由此可见,佩尔方程的求解是有趣的,其计算也是繁琐的。输入 n=92,方程的基本解:输入 n=73,方程的基本解:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 25 页 - - - - - - - - - 2. 枚举设计应用枚举试值来探求佩尔方程的基本解。设置 y 从 1 开始递增1 取值,对于每一个y 值,计算a=n*y*y 后判别 : 若 a+1 为某一整数x 的平方,则 (x,y)即为所求佩尔方程的基本解。若 a+1 不是平
19、方数,则y 增 1 后再试,直到找到解为止。应用以上枚举探求,如果解的位数不太大,总可以求出相应的基本解。如果基本解太大,应用枚举无法找到基本解,可约定一个枚举上限,例如10000000。可把 y10000000 时结束循环,输出“未求出该方程的基本解! ”而结束。3. 程序设计/ 解 PELL 方程 : x2-ny2=1 #include #include void main() double a,m,n,x,y; printf( 解 PELL方程 : x2-ny2=1.n); printf( 请输入非平方整数 n:); scanf(%lf,&n); m=floor(sqrt(n+1); i
20、f(m*m=n) printf( n为平方数 ,方程无正整数解!n); return; y=1; while(y10000000) printf( 未求出该方程的基本解!); 4. 程序运行示例与说明解 PELL方程 : x2-ny2=1. 请输入非平方整数 n:73 方程 x2-73y2=1的基本解为 : x=2281249, y=267000 为了提高求解方程的范围,数据结构设置为双精度(double )型。如果设置为整形或长整形,方程的求解范围比设置为双精度型要小。例如n=73 时,设置整形或长整形就不可能求出相应方程的解。可见,数据结构的设置对程序的应用范围有着直接的影响。对某些 n,
21、相应佩尔方程解的位数太大。例如当 n=991 时, 相应佩尔方程的基本解达30位。此时只有通过某些专业算法(例如连分数法)才能进行求解。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 25 页 - - - - - - - - - 5. 分解质因数整数分解质因数是最基本的分解。例如,90=2*3*3*5, 1960=23*5*72 ,前者为质因数乘积形式,后者为质因数的指数形式。把指定区间上的所有整数分解质因数,? 每一整数表示为质因数从小到大顺序的乘积形式。如果被分解的数
22、本身是素数,则注明为素数。例如 , 92=2*2*23, 91(素数 !) 。分解:1671861 58452716. 构建横竖折对称方阵试观察图所示的横竖折对称方阵的构造特点,总结归纳其构造规律,设计并输出n(奇数)阶对称方阵。图 7阶横竖对称方阵输出 15 阶、 19 阶横竖折对称方阵。10. 统计试统计含有数字7 且不能被7 整除的 m位整数的个数s1,并指出这s1 个数中不含有数字 4 的整数的个数s2。输入 m, 输出 s1,s2 。m=5, 输出:m=6, 输出:(1) 设计要点首先通过乘m-1 个 10 计算 m位数的起点b=10(m-1), 为枚举提供范围t(b 10*b-1)
23、 。为了检测 m位数 t 含有多少个数字7, 每个 m位整数 t 赋给 d( 以保持 t 不变 ), 然后通过m次求余先后分离出t 的 m个数字 c,if(c=7) f+, 统计整数t 中数字 7 的个数 f 。同时统计数字4 的个数 g。如果 f0 ,说明整数t 中含有数字7。如果 g=0,说明整数t 中不含数字4。对每一个 m位整数,据f0 & t%70, s1作相应统计。据f0 & t%70 & g=0, s2作相应统计。(2)程序设计/ 统计含数字7 且不能被7 整除的 m位整数的个数s1,其中不含数字4 的个数 s2 名师资料总结 - - -精品资料欢迎下载 - - - - - -
24、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 25 页 - - - - - - - - - #include void main() int c,f,g,i,j,m; long b,d,s1,s2,t; printf( 请输入位数m (2=m=9): ); scanf(%d,&m); b=1; s1=0;s2=0; for(i=2;i=m;i+) b=b*10; / 计算 m位数的起点 for(t=b;t=10*b-1;t+) / 枚举每一个m位数 d=t; f=0;g=0; for(j=1;j0 & t%70) s1+; / 统计含
25、数字7 且不能被7 整除数的个数if(f0 & t%70 & g=0) s2+; / 统计其中不含数字4 的个数 printf( s1=%ld ,s2=%ld n,s1,s2); (3) 程序运行示例请输入位数m (2=k=9): 5 s1=32152 ,s2=20412 请输入位数m (2=k3)位整数中恰含有2 个 7 且恰含有1 个 4 的整数的个数. 11. 构建斜折对称方阵试观察图所示的斜折对称方阵的构造特点,总结归纳其构造规律,设计并输出n(奇数)阶斜折对称方阵。图 7阶斜折对称方阵输出 15 阶、 19 阶斜折对称方阵。(1) 构造规律与赋值要点斜折对称方阵的构造特点:两对角线上
26、均为“0” ,依两对角线把方阵分为4 个区域,每名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 25 页 - - - - - - - - - 一区域表现为同数字依附两对角线折叠对称,至上下左右正中元素为n/2 。同样设置 2 维 ann数组存储方阵中元素,行号为i ,列号为 j ,aij为第 i 行第j 列元素。令 m=(n+1)/2, 按 m把方阵分成的4 个小矩形区如图所示。图按 m分成的 4 个小矩形注意到方阵的主对角线(从左上至右下)上元素为:i=j ,则左上区与
27、右下区依主对角线赋值: aij=abs(i-j); 注意到方阵的次对角线(从右上至左下)上元素为:i+j n+1,则右上区与左下区依次对角线赋值: aij=abs(i+j-n-1); (2) 程序设计/ 斜折对称方阵#include #include void main() int i,j,m,n,a3030; printf( 请确定方阵阶数( 奇数 )n: ); scanf(%d,&n); if(n%2=0) printf( 请输入奇数! );return; m=(n+1)/2; for(i=1;i=n;i+) for(j=1;j=n;j+) if(i=m & jm & jm) aij=ab
28、s(i-j); / 方阵左上部与右下部元素赋值 if(im | im & j=m) aij=abs(i+j-n-1); / 方阵右上部与左下部元素赋值 printf( %d阶对称方阵为:n,n); for(i=1;i=n;i+) for(j=1;j=n;j+) / 输出对称方阵 printf(%3d,aij); printf(n); 运行以上两个程序,可以在欣赏各个具体的对称方阵中,感受从特例到一般的神奇。12. 台球碰撞在平面直角坐标系下,台球桌是一个左下角在(0,0) ,右上角在 (L,W) 的矩形。 有一个球心在 (x,y),半径为R的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后
29、, 球沿极角为b的射线(即:x正半轴逆时针旋转到此射线的角度为b)以初速度v 飞出。因球与桌面的磨擦,球作的加速度为a 的匀减速率运动, 每次碰到球桌边框时均发生完全弹性碰撞(反名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 25 页 - - - - - - - - - 射角等于入射角) 。试求球停止时球心所在位置。输入: l=180,w=120,x=35,y=40,r=5,b=30,v=27,a=6 输出: (87.61,70.37) 原题:在平面直角坐标系下,台球桌
30、是一个左下角在(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=a360, 1=v,s=105) ,含义见题目描述。L=W=x=y=R=a
31、=v=s=0 表示输入结束,你的程序不应当处理这一行。输出对于每组数据,输出仅一行,包含两个实数x, y,表明球心坐标为(x,y) 。x和y应四舍五入保留两位小数。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 25 页 - - - - - - - - - 样例输入样例输出100 100 80 10 5 90 2 23 110 100 70 10 5 180 1 9999 0 0 0 0 0 0 0 0 80.00 56.00 71.00 10.00设计要点 : (1)
32、(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.14159/180) y=y0+v*s*sin(a*3.14159/180) (3) 撞击轴对称若球与右竖边(x2)撞击,撞击后横月座标为:x=2*x2-x 若球与上横边(y2)撞击,撞击后纵月座标为:y=2*y2-y 程序设计:/ 台球碰撞#include #include vo
33、id 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;
34、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,%.2f).n,x,y); 请确定球台边框(l,w): 130,110 请确定球心开始位置(x,y): 30,40 请确定球半径r: 5 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - -
35、 - - - 第 12 页,共 25 页 - - - - - - - - - 请确定射击角度a: 30 请确定射击速度v: 20 请确定时间s: 20 所求位置为 :(113.59,40.00). 引申: 在平面直角坐标系下,台球桌是一个左下角在(0,0) ,右上角在 (L,W) 的矩形。有一个球心在 (x,y) ,半径为r 的圆形母球放在台球桌上(整个球都在台球桌内)。受撞击后,球沿极角为b的射线(即:与正半轴逆时针旋转到此射线的角度为b)以初速度v 飞出。因球与桌面的磨擦, 球作的加速度为a 的匀减速率运动,每次碰到球桌边框时均发生完全弹性碰撞(反射角等于入射角)。试求球停止时球心所在位置
36、。解:球作的初速度为, 加速度为的匀减速率运动,设时刻球的速度为, 则速度公式 : 位移公式 : 速度位移公式 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 25 页 - - - - - - - - - 球运行距离为:/ 台球碰撞#include #include void main() double l,w,r,a,b,v,s,x,y,x1,x2,y1,y2; printf( 请确定球台边框(l,w): ); scanf(%lf,%lf,&l,&w); prin
37、tf( 请确定球心开始位置(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*cos(b*3.1415926/180); y=y+s*sin(b*3.1415926/180); while(xx2 | yy2
38、) if(xx2) x=2*x2-x; if(xy2) y=2*y2-y; if(yy1) y=2*y1-y; printf( 球停止时球心所求位置为:(%.2f,%.2f).n,x,y); 请确定球台边框(l,w): 180,120 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 25 页 - - - - - - - - - 请确定球心开始位置(x,y): 35,40 请确定球半径r: 5 请确定射击角度b: 30 请确定射击初速度v: 27 请确定匀减速的加速度a:
39、 6 球停止时球心所求位置为:(87.61,70.37). 程序变通:/ 台球碰撞#include #include void 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: ); scanf(%lf,&r); printf( 请确定射击角度b: ); scanf(%lf,&b); printf( 请确定射击初速度v: ); sc
40、anf(%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) if(xx2) x=2*x2-x; if(xx1) x=2*x1-x; while(yy2) if(yy2) y=2*y2-y; if(yy1) y=2*y1-y; printf( 球停止时球心所求位置为:(%.2f,%.2f).n,x,y); 13. 解不等式已知 a,b 为正整数,试
41、求满足不等式的正整数 n。输入 a,b, 输出 n. a,b:100,1000, 输出:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 25 页 - - - - - - - - - a,b:2010,2011,输出:(1) C程序设计#include #include void main() long a,b,c,d,i; double s; printf( 请输入正整数a,b:);scanf(%ld,%ld,&a,&b); i=0;s=0; while(sa) i=i
42、+1;s=s+sqrt(i)/(i+1); c=i; while(sb) i=i+1;s=s+sqrt(i)/(i+1); d=i-1; printf(n 满足不等式的正整数n 为: %ld n%ld n,c,d); (2) 程序运行结果请输入正整数a,b:100,1000 满足不等式的正整数n 为: 2667 n 251660 请输入正整数a,b:2010,2011 满足不等式的正整数n 为: 1013363 n1014369 14. 分数化小数设计程序,接受一个N/D 形式的分数,其中N为分子, D为分母(约定N,D200) ,输出它的小数形式。如果它的小数形式存在循环节,要将其用括号括起
43、来,并计算输出循环节的位数。例如: 1/3=.(3);3/8=.375 ; 45/56=.803(571428) 输出 83/92 的小数:输出 11/59 的小数:(1) 设计要点模拟整数除法,重复地进行求商和余数的运算,直到余数为0 或出现循环节为止。设置 a 为被除数, d 为除数,每一个商存放在b数组中,每一个余数存放在c 数组中。试商过程: a=ck*10;bk=a/d;ck+1=a%d 。我们应用余数相同来判断循环节。经 k+1 次试商的余数分别为c1 , c2 , , , ck+1 。若 ck+1=cj(j=1, 2, , , k) , 则 b1 , , , bj-1为循环节前的
44、小数; 循环节为bj, , ,bk 。注意:程序之所以把除数d 的值作为试商次数k 的上限是因为循环节长度与循环节前小数长度之和总是小于d。其实,也可以不设上限,直到得出循环节才终止程序。(2) 程序实现/ 分数化小数#include void main() 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 25 页 - - - - - - - - - int a,d,n,r,i,j,k,t,u,c200,b200; printf(input n,d:);scanf(%d
45、,%d,&n,&d); a=n/d;c1=n%d; printf( %d/%d=,n,d); if(a!=0) printf(%d,a); / 输出整数部分 printf(.); for(k=1;k=d;k+) a=ck*10;bk=a/d;ck+1=a%d;u=0; / 实施试商 if(ck+1=0) / 余数为零,打印小数 for(i=1;i=k;i+) printf(%d,bi); break; for(j=1;j=k;j+) if(ck+1=cj) / 余数相同,有循环节 for(t=1;tj;t+) printf(%d,bt); / 打印循环节前的小数 printf();r=k-j+
46、1; for(t=j;t 2x+3y A (3)再无其他数属于A。试求集合 A中元素从小到大排列序列的第n 项。n=500, 输出:n=2011, 输出:(1) 设计要点设置 a 数组存储序列各项,a(t)为序列的第t 项。显然 a(1)=1,a(2)=2。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 25 页 - - - - - - - - - 设 t 为项数,在tn 的条件循环中,变量k 从 2 开始递增1 取值。若 k 可由已有的项a(j), a(i) (ji)
47、推得,即若k 满足条件k=2*a(j)+3*a(i) 或k=2*a(i)+3*a(j),说明 k 是 a 数列中的一项,赋值给a(t) 。当项数 t 达到规定项数n 时,则退出循环,打印输出a(n) 后结束。(2) 程序设计/ 2x+3y按项的大小枚举设计#include void main() int n,t,k,i,h,j,a30000; printf(请输入 n: ); scanf(%d,&n); a1=1;a2=2; t=2;k=2; while(tn) k+;h=0; / 枚举 k 是否为 A集项for(i=2;i=t;i+) for(j=1;jd,退出循环,得一个区间解n+1, 。
48、注意,此时n 还须进行进一步检测。然后回过头来一项项求和,包括对n 的检测,得离散解。(2)程序设计/ 解不等式: d1+1/2-1/3+1/4+1/5-1/6+.1/n #include void main() long d,n,k; double s; printf( 请输入正整数d: ); scanf(%d,&d); printf( %dd) break; n=n+3; printf( n=%ld n,n+1); / 得一个区间解 k=1;s=0; while(k0) s=s+1.0/k; else s=s-1.0/k; if(sd) / 得到离散解 printf( n=%ld n,k)
49、; k+; (3)改进设计/ 解不等式: d1+1/2-1/3+1/4+1/5-1/6+.1/n #include void main() long d,n; double s; printf( 请输入正整数d: ); scanf(%d,&d); printf( %dd) break; n=n+3; s=s+1.0/(n+2)-1.0/(n+1); / 返回两项,判断分母为n 时的值 if(sd) printf( n=%ld n,n); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
50、 19 页,共 25 页 - - - - - - - - - else printf( n=%ld n,n+1); / 得一个区间解 s=s-1.0/n+1.0/(n-1); / 再返回两项,判断分母为n-2 时的值 if(sd) printf( n=%ld n,n-2);/ 得到离散解 (4) 程序运行示例请输入正整数d: 5 5=203938 n=203936 请输入正整数d: 6 6=4096159 n=4096157 注意:前一个是区间解,后一个是离散解。要特别注意,不要遗失离散解。(5) 验证程序/ 求和: s=1+1/2-1/3+1/4+1/5-1/6+.1/n #include