《趣味C语言编程讲解.docx》由会员分享,可在线阅读,更多相关《趣味C语言编程讲解.docx(77页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1100匹马驮货,大马一匹驮3担,中马2担,小马1担,计算大,中,小马的数量。/* 1. C*100匹马驮货,大马一匹驮3担,中马2担,小马1担,计算大,中, 小马的数量。*/#include Sinclude int main()int d, z, x;printf (大、中、小马的个数分别为:n);for(d = 1;d 98;d+)(for (z = 1;z 98;z+)(for(x = l;x 98;x+)(if(100 = (3*d+2*z+l*x)(printf (zz%dt%dt%dnz,, d, z, x);return 0;2, 一辆K车违反交通规则,撞人逃跑。现场3人目击,
2、但没记住车号,只记下车的特征。甲说:牌照前 两位数相同,乙说:牌照后两位数相同。丙是位数学家,他说:四位的车号刚好是个整数的平方。请求 出车号。/* 2. c* 一辆卡车违反交通规则,撞人逃跑。现场3人目击,但没记住车号,只 记下车的特征。* 甲说:牌照前两位数相同,乙说:牌照后两位数相同。* 丙是位数学家,他说:四位的车号刚好是一个整数的平方。请求出车号。* /Sinclude #include int main()(int data, g, s, b, q, i;printf (可能的车牌号是:n);for(data = 1000;data 10000;data+) (g = data %
3、 10;s = data / 10 % 10;b = data / 100 % 10;q = data / 1000;if(g = s) & (b = q)(for(i = 1;i 100;i+)(if(i * i) = data)(printfdata);return 0;3,韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1到5报,最末一个士兵报的数为1; 按从1到6报,最后一个士兵报的数为5,按从1到7报,最末一个士兵报的数为4:最后在按从1到 11报,最末一个士兵报的数为10.你知道韩信至少有多少兵吗?/* 3. C* 韩信有一队兵,他想知道有多少人,便让士兵排队报数:* 按从1
4、到5报,最末一个士兵报的数为1;按从1到6报,最后一个士 兵报的数为5,* 按从1到7报,最末一个士兵报的数为4;最后在按从1到11报,最 末一个士兵报的数为10.* 你知道韩信至少有多少兵吗?*/#include ttinclude int main()int data, i, j, k, h;printf (韩信拥有的兵总数可能是:n); for(data = 10;data 32767;data+) (i = data % 5;j = data % 6;k = data % 7;h = data % 11;if(1 = i) & (5 = j) & (4 = k) & (10 = h)
5、(printf (,%dn,z, data);return 0;4,若一个口袋中放12个球,其中3个红色,3个白,6个黑,从中取8个球,问有多少种不同颜色搭配? /* 4. C*若一个口袋中放12个球,其中3个红色,3个白,6个黑,从中取8 个球,问有多少种不同颜色搭配?*/ttinclude Sinclude int main()int red,write, black;int flag = 0;printf (可能的搭配方案有:n红t白t黑n); for (red = 0;red 4;red+) for(write = Ojwrite 4;write+)(for(black = 0;bla
6、ck 7;black+)(if(8 = (red + write + black)(flag = flag + 1;printf (z,%dt%dt%dnzz, red, write, black);printf 种. n,flag);return 0;)5,鸡兔同笼。已知鸡兔的总头数为head,总脚数为feet,编写程序求鸡兔各多少只?# include # define head 20/总头数为 head# define feet 50 总脚数为 feet,void main(void)int i= 0; 鸡的个数for(i=0;i = head;i+ + )if(i* 2)+ (head
7、-i)*4) = = feet)printf(%5d%5d,i,(head-i);/ printf(error);)6,小丁和小明小红三个小朋友并排在有灰尘的楼梯上同时从顶上向下走。小明一步下2阶,小红一步下3阶,小丁一步下4阶,如楼梯顶和楼底均有所有3人的脚印,那么仅有 一个人脚印的楼梯最少有儿级?小丁和小明小红三个小朋友并排在有灰尘的楼梯上同时从顶上向下走小明一步下2阶,小红一步下3阶,小丁一步下4阶,如楼梯顶和楼底均有所有3人的脚印,那么仅有一个人脚印的楼梯最少有几级?# include void main(void)int i,j= 0;for(i= 1 ;i 100;i+ + )if
8、(i%2= = 0&i%3!=0&i%4!=0)|(i%2!=0&i%3= = 0&i%4!=0)|(i%2!=0&i%3!=0& i%4= = 0) printf(%dn%M,i); j+ + ;if(i% 2= = 0&i%3= = 0&i% 4= = 0)break;printf(%d %dn,j,i);7,在12张长片中,有3张上面写着3,有3张上面写着5,有3张上面写着7.试问,能否从中抽出5 张使他们上面数的和为20?/* 7. c*在12张卡片中,有3张上面写着3,有3张上面写着5,有3张上面写 着7.试问,能否从中抽出5张使他们上面数的和为20?*/#include ttinc
9、lude int main()int c3, c5, c7;int flag = 0;printfC3, 5, 7 和为 20 可能的搭配方案有:n (3)t (5)t (7) n); for(c3 = 1;c3 4;c3+)(for(c5 = 1;c5 4;c5+)(for (c7 = 1;c7 4;c7+)if (5 = (c3 + c5 + c7)if(20 = (c3 * 3 + c5 * 5 + c7 * 7)flag = flag + 1;printf C%dt%dt%dn,z, c3, c5, c7);printf (共d 种. n,flag);return 0;8,有对兔子,从
10、出生后第3个月起每月生对兔子,小兔子长到第三个月后每月又生对兔子,假如兔子都不死,问一年中可以繁殖成多少对兔子?提示:兔子的规律为数列1, 1, 2, 3, 5, 8 即从第3个月起每个月的兔子使前两个月的兔子之和。/* 8. c* 有一对兔子,从出生后第3个月起每月生一对兔子,小兔子长到第三个 月后每月又生一对兔子,* 假如兔子都不死,问一年中可以繁殖成多少对兔子?提示:兔子的规律 为数列 1, 1, 2, 3, 5, 8,* 即从第3个月起每个月的兔子使前两个月的兔子之和。* /*这个是从手册里找到的一个类似的例子,楼主自己改一下题目:古典问题:有一对兔子,从出生后第3个月起每个月都生-对
11、兔子, 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为 多少?1 .程序分析:兔子的规律为数列1, 1, 2, 3, 5, 8, 13, 21.2 .程序源代码:*/#include #include int main()(long fl, f2;int i;fl = 1;f2 = 1;for(i = l;i = 20;i+)(printfC%121d, %121d*, fl, f2);if(i % 2 = 0)(printf(n); /*控制输出,每行四个*/)fl = fl + f2; /*前两个月加起来赋值给第三个月*/f2 = fl + f2; /*前两个
12、月加起来赋值给第三个月*/return 0;/* 8. c* 有一对兔子,从出生后第3个月起每月生一对兔子,小兔子长到第三个 月后每月又生一对兔子,* 假如兔子都不死,问一年中可以繁殖成多少对兔子?提示:兔子的规律 为数列 1, 1, 2, 3, 5, 8,* 即从第3个月起每个月的兔子使前两个月的兔子之和。*/#include #include int main()(long fl, f2;int i;fl = 1;f2 = 1;for(i = 1;i = 6;i+)printfC%121d, %121d*, fl, f2);if(i % 2 = 0)(printf(n); /*捽制输出,每
13、行四个*/)fl = fl + f2; /*前两个月加起来赋值给第三个月*/f2 = fl + f2; /*前两个月加起来赋值给第三个月*/return 0;9,解爱因斯坦数学题。有一条长阶梯,若每步跨2阶,则最后剩1阶;每步跨3阶,最后剩2阶;每步 跨5阶,最后剩4阶;每步跨6阶最后剩5阶;每步跨7阶,最后 阶不剩。问这条阶梯至少多少阶?、 /* 9. c* 解爱因斯坦数学题。* 有一条长阶梯,若每步跨2阶,则最后剩1阶;每步跨3阶,最后剩2 阶;* 每步跨5阶,最后剩4阶;每步跨6阶最后剩5阶;每步跨7阶,最后 一阶不剩。* 问这条阶梯至少多少阶?* /Sinclude ttinclude
14、 int main()(int stairs = 0;int i2, i3, i5, i6, i7;printf (这条阶梯至少有);for (;stairs+)(12 = stairs % 2;13 = stairs % 3;15 = stairs % 5;16 = stairs % 6;17 = stairs % 7;if(l = i2) & (2 = i3) & (4 = i5) & (5 = i6) & (0 =i7)(printf (/z%d 阶.n, stairs);break;return 0;10,猴子吃桃问题:猴子第一天摘下若干个桃,当即吃了一半,还不过瘾,有多吃了个,第二天
15、早上又 将剩下的桃吃掉一半,有多吃了一个.以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想 在吃时,见剩下一个桃了。求第一天共摘了多少?/* 10.c* 猴子吃桃问题:猴子第一天摘了若干个桃,当即吃了一半,还不过瘾, 又多吃了一个,* 第二天早上又将剩下的桃吃掉一半,又多吃了一个。* 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想吃时, 见剩下一个桃了。* 求第一天共摘了多少?*/ttinclude ttinclude int main()int day, xl, x2;day = 9;x2 = 1;while(day 0)(xl = (x2 + 1) * 2;x2 =
16、xl;day = day - 1;)printf (第一天共摘了d个桃.n”, xl);return 0;)/* 10.c* 猴子吃桃问题:猴子第天摘了若干个桃,当即吃了 半,还不过瘾,乂多吃了 个,* 第二天早上又将剩下的桃吃掉一半,又多吃了一个。* 以后每天早上都吃了前天剩下的半零个。到第10天早上想吃时,见剩下 个桃了。* 求第一天共摘了多少?* /# include stdio.hvoid main()(int num,i;num= 1;for(i=9;i = 1;i-)num= (num+ 1)*2;printf(第一天共摘了d 个n,num);/* 10.c* 猴子吃桃问题:猴子第
17、一天摘了若干个桃,当即吃了一半,还不过瘾,又多吃了一个,* 第二天早上又将剩下的桃吃掉一半,又多吃了一个。* 以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想吃时,见剩下一个桃了.* 求第一天共摘了多少?* /# include Hstdio.hvoid main()(int num,i;num= 1;for=9;i = 1 ;i-)num= (num+ 1)*2;printf(第一天共摘了d 个n,num); )11,把张100元的人民币兑换成若干20元和10元的人民币,要求两种面值各至少有张,清编程, 统计并输出所有兑换方法./* 1 1. C* 把一张100元的人民币兑换成若干
18、20元和10元的人民币,要求两种面 值各至少有张,* 请编程,统计并输出所有兑换方法。* /Sinclude * include int main()Cint i20,i10;printf Cl张100元可兑换20, 10元人民币,所有兑换方法如下:n20 元tl0 元n);for(i20 = l;i20 = (100 / 20);i20+)(for(i10 = l;il0 = (100 / 10);il0+)(if(100 = (i20 * 20 + iio * 10)(printf (zz%dt%dn/z, i20, i 10);return 0;对于jillnicky的11题答案,个人觉
19、得有些复杂,尤其是两个for循环和一个if条件判断,这样复杂度太高,不是太理想。提供我个人的答案,供楼主参考。jillnicky做了这么多题,很辛苦,也希望以后能和j川nicky多交流,呵呵。# include int main()(/100 yuanint Sum = 100;/ N is for 10 , T is for 20int N = 10;int T = 20;int i;for ( i= 1; T*i =0&b=10&b=100&b=1000&b=9999);printf (* %dnX %dnn”, a, b);c0=b%10;cl=(b-(c0)%100)/10;c2=(b
20、-(c0)-(c1*10)%1000)/100;c 3 = (b- (c 0) - (c 1 *10) - (c 2 *100) /1000;printf (z, %dn %dn %dn %dnn %d”,a*c0, a*c1, a*c2, a*c3, a*b);/ *除法函数*/void cfa(int a, int b) int i;if(a=0;i+);if(ab*i)0)-i ;printf (z,%d4-%d=%d%d”,a, b, i, a-b*i) ; /*主函数*/int main() int times, i, numl100 = 0, num2100 = 0;char fh
21、 = 0;printf(please input the times;);scanf×);for(i=0;itimes;i+)(scanf (,z%d%c%d,z, &numl i, &fhi, &num2i);getchO ;if(fhi!= - )&(fhi!= * )&(fhi != / )&(fhi != +) printf(you input date not found mathematical char!n ); printf Cyou must input this postrue again!nz/);i;)for (i=0;itimes;i+)switch(fhi
22、)case + : printf ( %dn+ %dnn%dnz,, numli, num2i, numli+num2i) ;break;case : printf C %dn-%dnn %dn”, numl i, num2i, numl i+num2i);break;case * : cf(numli, num2i);break;case / : cfa(numli, num2i);break;default : printf (you input date not found mathmatical char! n,z) ; getchO ;return 0;)15.输入一批学生的成绩,输
23、入-i时结束。求最高分,最低分和平均分/*15.c#include#includeusing namespace std;void main()|float maxscore,minscore,cscore,temp,n;n=0;cscore=0;coutvv”请输入成绩(-1结束):Mendl;cintemp;assert(temp=-1 &temp=-1 &cscoremaxscore)maxscore=cscore;if(cscoreminscore&cscore!=-1) minscore=cscore;if(cscore!=-1)temp4-=cscore;coutMn The 最高
24、分 tvvmaxscore;coutn The 最低分 tHminscore;coutHn The 平均分 tHtemp/n;int m;查看结果时用的cinm;/*15. c#includeusing namespace std;void main()int maxscore,minscore,cscore,temp,n;cscore=0;n=0;coutvv”请输入数据,结束vvendl;cintemp;minscore=temp;maxscore=temp;while(cscore!=-1)n+;cincscore;if(cscoremaxscore)maxscore=cscore;if
25、(cscoreminscore&cscore!=-1) minscore=cscore;if(cscore!=-1)temp=temp-i-cscore;coutvv”最高分“vvmaxscorevvendl;coutvv最低分“vvminscorevvendl;coutvv”平均分vv(float(temp)/n)vvendl;/*15. c#includeusing namespace std;int main()(int max=-10000,min=10000,sum=0,index=0,temp;doscanf(cT,&temp);if(temp=-1) break;sum +=te
26、mp;+index;max = maxtemp?temp:min;while(1);printf(*the max score:%dn”,max);printf(the min score:%drT,min);printf(Mthe average score:%dnM,sum/index);return 1;16.楼主有16个有水的瓶子 其中只有瓶有毒这时有4只试验老鼠如何一次性就能判断哪个瓶子有毒?(请不要上网查哦,尽量靠自己想)10分题 .注: 1 个网友回答:16个瓶子分别标出1到164个老鼠标1到4然后瓶子一喂第一个老鼠0001 .O.二 ,第二 个老鼠0010O O O O :O
27、O , O O O O 001 1十三。一二四 个老鼠1101最后看哪几个老鼠死了计算一下就知道了是i种数字编码.注:2编程论坛4个网友回答:4只老鼠编号0316个瓶子编号0150 0 0 0 -瓶0不给鼠00 0 1 -瓶1给鼠00 0 I 0 -瓶2给鼠10011-瓶3给鼠0和鼠10 1 0 0 -瓶4给鼠2I 1 0 1 -瓶14给鼠0和鼠2和鼠31 1 1 1 一瓶15给鼠0和鼠1和鼠2和鼠3 最后看哪儿只倒霉的老鼠死抻,结果对应015中的哪个17.在爱尔兰守神节那天,举行每年一度的庆祝游戏,指挥者若将乐队排成10人、9人、8人、7人、6人、5人、4人、3人和2人时,最后的一排总是缺少
28、一个人,那些人想这个位置大概是给数月前死去的乐队成员凯西还留着 位置。指挥者见到总缺一人恼火了,叫大家排成一列纵队前进。假定人数不超过7000人,那么乐队究竟有多少人? /17.Cmain()int i, j;for (i=9;i =2;H/* 模拟排队过程*/if (i+1)%j!=0) break;/*不满足条件则重新取值*/if 0=1)/*已满足条件*/printf(乐队共有d 人。,i);exit(0);)题眼就是求出210的最小公倍数,然后减一。模拟排队的算法是可行的,但不是最优的。#include int od(int x,int n) x是否能被n整除,是返回1,否返回0 (i
29、f (x%n) return 0;return 1;)int gbs(int a,int n) 求an内所有元素的最小公倍数int i,j,k,o,m=0;int b20,c100;for (i=0;in;i+)(if(mai) m=ai;bi=ai;)j=2; o=0;while (j=m)k=0;for (i=0;i1) break;if(k1)co+=j;for (i=0;in;i+)if (od(bi,j) bi=bi/j;m=0;for (i=0;in;i+) if(mbi) m=bi;)elsej+;)k=1;for(i=0;io;i+)(k*=ci;for (i=0;in;i+)
30、(k*=bi; return k;main()(int a10;for(int i=1;i=10;i+)ai-1=i;printf(,count=%dn,gbs(a,10)-1);getchar();return 0;)调试通过的程序代码如下:#include main() inti;for (i=9;i7000;i+=2)if (i%10=9 & i%9=8 & i%8=7 & i%7=6 & i%6=5 & i%5=4 & i%4=3 & i%3=2)printf(,%dn,i);上面的程序运行结果如下:25195039这个问题还是比较简单的,思路如下:首先要写一个判断程序,判断当前的正整
31、数是否除210都缺1,然后从0到7000依次判 断,不断的调用这个函数,如果成功就输出人数并跳出循环。代码如下:#includeint Que(int i,int n)(int flag=1;for(int j=2;j=n;j+)(if(i+1)%j)(flag=0;break;)return flag;void main()(for(int i=0;i7000;i+)if(Que(i,10)(coutvv人数为:viendl;break;)10的倍数减一,最后一位必定为9,所以从9开始每次加10,然后再验证i+1同时是9-2的倍 数,都满足则ok楼主你的方法不见得最简单!如果限制不是7000
32、,而是更大。那你的效率会越来越低!试试我的!#include#includevoid main()int minNum;int sum = 2; /sum表示前面N个数的最小公倍数,初始为2的公倍数,即为2for(inti=3;ii?i:sum;for(int k=minNum; k1; k-)if(sum%k=0 & i%k=0) 取两个数的最大公约数 break;)sum = sum * i/k;两个数的乘机除以最大公约数=两个数的最小公倍数)while(sum7000)printf(result: %dn, sum-1);sum *= 2; 以2的倍数增加,小于7000继续循环很简单,写
33、一个暴力枚举。但注意一下细节可以省很多时间:1循环每次增10,因为最后一位一定是9.2无需判断2, 3, 4,因为之前已经判断了 6, 8; 6, 8分别是3和2, 4的倍数。#includeusing namespace std;int main()for(int i=19;i=6999;)if(i+1 )%9=0&(i+1 )%8=0&(i+1 )%7=0&(i+1 )%6=0&(i+1)%5=0) coutii+=10;)趣味c语言编程100例(一)2007-04-18 17:17经典c程序100例二二1一10【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位
34、数?都是多少?1 .程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。2 .程序源代码:main ()(int i, j, k;printf(*n*);for (i=l; i5; i+)/ *以下为三重循环*/for(j=l;j5;j+)for (k=l;k k 三位互不相同*/printf (z/%d, %d, %dn”, i, j, k);【程序2】题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可成7. 5%: 20
35、万到40万之间时,高于20万元的部分,可提成5%: 40万到60万之间时高 于40万元的部分,可提成3%; 60万到100万之间时,高于60万元的部分,可提成1.5%, 高于100万元时,超过100万元的部分按现提成,从键盘输入当月利润I,求应发放奖金总数?1 .程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。2 .程序源代码:main()(long int i;int bonus1, bonus2, bonus4,bonus6,bonus 10,bonus;scanf (*%ld, &i);bonusl = 100000*0. 1;bonus2=bonus1+100000*
36、0.75;bonus4=bonus2+200000*0. 5;bonus6=bonus4+200000*0. 3;bonus10=bonus6+400000*0. 15;if(i=100000)bonus=i*0. 1;else if(i=200000)bonus=bonus1+(i-100000)*0. 075;else if(i=400000)bonus=bonus2+(i-200000) *0. 05;else if(i=600000)bonus=bonus4+(i-400000)*0. 03;else if(i=1000000)bonus=bonus6+(i-600000)*0. 01
37、5;elsebonus=bonusl0+(i-1000000)*0. 01;printf(bonus=%d”, bonus);)【程序3】题一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数 是多少?1 .程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加匕268后再开方,如 果开方后的结果满足如下条件,即是结果。请看具体分析:2 .程序源代码:#include math, h”main ()(long int i, x, y, z;for (i=l;i100000;i+) x=sqrt(i+100);/*x为加上100后开方后的结果*/y=sq
38、rt(i+268);/*y为再加上168后开方后的结果*/if(x*x=i+100&y*y=i+268)/*如果一个数的平方根的平方等于该数,这说明此数是完全 平方数*/printf(*n%ldn*,i);【程序4】题目:输入某年某月某口,判断这一天是这一年的第几天?1 .程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第儿天, 特殊情况,闰年且输入月份大于3时需考虑多加一天。2 .程序源代码: main() int day, month, year, sum, leap;printf (*nplease input year, month, dayn,z);scanf (*%d, %d, %d”, &y