C语言竞赛题目大全(9)

2019-08-30 23:10

一,百钱买百鸡,问翁、母、雏各几何? *题目分析与算法设计 设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程: 5x+3y+z/3=100 x+y+z=100 所以此问题可归结为求这个不定方程的整数解。 由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。 *程序说明与注释 #include void main() { int x,y,z,j=0; printf(\ for(x=0;x<=20;x++) /*外层循环控制鸡翁数*/ for(y=0;y<=33;y++) /*内层循环控制鸡母数y在0~33变化*/ { z=100-x-y; /*内外层循环控制下,鸡雏数z的值受x,y的值的制约*/ if(z%3==0&&5*x+3*y+z/3==100) /*验证取z值的合理性及得到一组解的合理性*/ printf(\ } } *运行结果 Follwing are possible plans to buy 100 fowls with 100 Yuan. 1:cock=0 hen=25 chicken=75 2:cock=4 hen=18 chicken=78 3:cock=8 hen=11 chicken=81 4:cock=12 hen=4 chicken=84 *总是的进一步讨论 这类求解不定方程总理的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范上穷举和组合的方法来复盖可能得到的全部各组解。能否根据题意更合理的设置循环控制条件来减少这种穷举和组合的次数,提高程序的执行效率,请读者考虑。 37.爱因斯坦的数学题 爱因斯坦出了一道这样的数学题:有一条长阶梯,若每步跨2阶,则最最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请问这条阶梯共有多少阶? *题目分析与算法设计 根据题意,阶梯数满足下面一组同余式: x≡1 (mod2) x≡2 (mod3) x≡4 (mod5) x≡5 (mod6) x≡0 (mod7) *程序说明与注释 #include void main() { int i=1; /*i为所设的阶梯数*/ while(!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0))) ++i; /*满足一组同余式的判别*/ printf(\} *运行结果 Staris_number=119 *问题的进一步讨论

41

此题算法还可考虑求1、2、4、5的最小公倍数n,然后判t(t为n-1)≡0(mod7)是否成立,若不成立则t=t+n,再进行判别,直至选出满足条件的t值。请自行编写程序实现。 39.年龄几何 张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880,求以他们的年龄为前4项的等差数列的前20项。 *题目分析与算法设计 设数列的首项为a,则前4项之和为\前4 项之积为\。同时\。可采用穷举法求出此数列。 *程序说明与注释 #include void main() { int n,a,i; printf(\ for(n=1;n<=6;n++) /*公差n取值为1~6*/ for(a=1;a<=4;a++) /*首项a取值为1~4*/ if(4*n+6*a==26&&n*(n+a)*(n+a+a)*(n+a+a+a)==880) /*判断结果*/ for(i=0;i<20;i++) printf(\ \ /*输出前20项*/ } *运行结果 The series with equal difference are: 2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 38.换分币 用一元人民币兑换成1分、2分和5分硬币,共有多少种不同的兑换方法。 *题目分析与算法设计 根据题意设i,j,k分别为兑换的1分、2分、5分硬币所具有的钱数(分),则i,j,k的值应满足: i+j+k=100 *程序说明与注释 #include void main() { int i,j,k,count=1; printf(\ for(i=0;i<=100;i++) /*i为1分硬币钱数,可取值0,1,2...,100*/ for(j=0;j<=100-i;j+=2) /*j为2分硬币钱数,可取0值,2,4,...,100*/ for(k=0;k<=100-i-2*j;k+=5) /*k为5分硬币钱数*/ if(i+j+k==100) printf(count%4?\} 40.三色球问题 若一个口袋中放有12个球,其中有3个红的。3个白的和6个黒的,问从中任取8个共有多少种不同的颜色搭配? *题目分析与算法设计 设任取的红球个数为i,白球个数为j,则黒球个数为8-i-j,根据题意红球和白球个数的取值范围是0~3,在红球和白球个数确定的条件下,黒球个数取值应为8-i-j<=6。 *程序说明与注释 #include void main() { int i,j,count=0; printf(\ RED BALL WHITE BALL BLACKBALL\\\\n\ printf(\ for(i=0;i<=3;i++) /*循环控制变量i控制任取红球个数0 ̄3*/ for(j=0;j<=3;j++) /*循环控制变量j控制任取白球个数0 ̄3*/ if((8-i-j)<=6)

42

printf(\ %d %d %d\\\\n\} 34. 41.马克思手稿中的数学题 马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人? *题目分析与算法设计 设x,y,z分别代表男人、女人和小孩。按题目的要求,可得到下面的方程: x+y+z=30 (1) 3x+2y+z=50 (2) 用方程程序求此不定方程的非负整数解,可先通过(2)-(1)式得: 2x+y=20 (3) 由(3)式可知,x变化范围是0~10 *程序说明与注释 #include void main() { int x,y,z,count=0; printf(\ Men Women Children\\\\n\ printf(\ for(x=0;x<=10;x++) { y=20-2*x; /*x定值据(3)式求y*/ z=30-x-y; /*由(1)式求z*/ if(3*x+2*y+z==50) /*当前得到的一组解是否满足式(2)*/ printf(\ %d %d %d\\\\n\ } } 42.最大公约数和最小公倍数 求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM) *问题分析与算法设计 手工方式求两个正整数的蝚大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。 *程序与程序注释 #include void main() { int a,b,num1,num2,temp; printf(\ scanf(\ if(num1>num2) /*找出两个数中的较大值*/ { temp=num1; num1=num2; num2=temp; /*交换两个整数*/ } a=num1; b=num2; while(b!=0) /*采用辗转相除法求最大公约数*/ { temp=a%b; a=b; b=temp; } printf(\ /*输出最大公约数*/ printf(\ /*输出最小公倍数*/ } *运行结果 1.Input a & b: 20 55 The GCD of 20 and 55 is: 5 The LCM of them is: 220

43

2.Input a & b: 17 71 The GCD of 17 and 71 is: 1 The LCM of them is: 1207 3.Input a & b: 24 88 The GCD of 24 and 88 is: 8 The LCM of them is: 264 4.Input a & b: 35 85 The GCD of 35 and 85 is: 5 The LCM of them is: 595 43.分数比较 比较两个分数的大小。 *问题分析与算法设计 人工方式下比较分数大小最常用的方法是:进行分数的通分后比较分子的大小。可以编程模拟手式方式。 *程序与程序注释 #include int zxgb(int a,int b); void main() { int i,j,k,l,m,n; printf(\ scanf(\ /*输入两个分数*/ m=zxgb(j,l)/j*i; /*求出第一个分数通分后的分子*/ n=zxgb(j,l)/l*k; /*求出第二个分数通分后的分子*/ if(m>n) printf(\ /*比较分子的大小*/ else if(m==n) printf(\ /*输出比较的结果*/ else printf(\} int zxgb(int a,int b) { long int c; int d; if(a16/32 输入:16/32,4/8 输出: 16/32=4/8 35. 44.分数之和 求这样的四个自然数p,q,r,s(p<=q<=r<=s),使得以下等式成立: 1/p+1/q+1/r+1/s+1 *问题分析与算法设计 若规定p<=q<=r<=s,将原式通分、化简并整理后得到: 2<=p<5 p<=q<7 q

44

#include void main() { int p,q,r,s,count=0; printf(\ for(p=2;p<5;p++) /*穷举分母*/ for(q=p;q<7;q++) for(r=q;r<13;r++) if(p*q*r-q*r-p*r-p*q!=0) { s=(p*q*r)/(p*q*r-q*r-p*r-p*q); /*求出s的值*/ if(!((p*q*r)%(p*q*r-q*r-p*r-p*q))&&s>=r) printf(\ 1/%d+1/%d+1/%d+1/%d=1\\\\n\,s); /*输出结果*/ } } -------------------------------------------------------------------------------- -- 作者:huang01 -- 发布时间:2004-10-21 17:06:39 -- 36. 45.将真分数分解为埃及分数 分子为1 的分数称为埃及分数,现输入一个真分数,请将该分数分解为埃及分数。 如:8/11=1/2+1/5+1/55+1/110。 *问题分析与算法设计 若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。 *程序与程序注释 #include void main() { long int a,b,c; printf(\ scanf(\ /*输入分子a和分母b*/ printf(\ while(1) { if(b%a) /*若分子不能整除分母*/ c=b/a+1; /*则分解出一个分母为b/a+1的埃及分数*/ else{ c=b/a; a=1;} /*否则,输出化简后的真分数(埃及分数)*/ if(a==1) { printf(\ break; /*a为1标志结束*/ } else printf(\ a=a*c-b; /*求出余数的分子*/ b=b*c; /*求出余数的分母*/ if(a==3) /*若余数为3,输出最后两个埃及分数*/ { printf(\ break;} } } *运行结果

45


C语言竞赛题目大全(9).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:云南省高中数学学业水平测试题分类汇编

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: