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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(C语言趣味程序设计编程百例精解.doc)为本站会员(dreamzhangning)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

C语言趣味程序设计编程百例精解.doc

1、C/C+语言经典、实用、趣味程序设计编程百例精解(1)2007 年 06月 19日 星期二 00:451.绘制余弦曲线 在屏幕上用“*”显示 0360度的余弦函数 cos(x)曲线 *问题分析与算法设计如果在程序中使用数组,这个问题十分简单。但若规定不能使用数组,问题就变得不容易了。关键在于余弦曲线在 0360度的区间内,一行中要显示两个点,而对一般的显示器来说,只能按行输出,即:输出第一行信息后,只能向下一行输出,不能再返回到上一行。为了获得本文要求的图形就必须在一行中一次输出两个“*” 。为了同时得到余弦函数 cos(x)图形在一行上的两个点,考虑利用 cos(x)的左右对称性。将屏幕的行

2、方向定义为 x,列方向定义为 y,则 0180度的图形与 180360度的图形是左右对称的,若定义图形的总宽度为 62列,计算出 x行 0180度时 y点的坐标 m,那么在同一行与之对称的 180360度的 y点的坐标就 应为 62-m。程序中利用反余弦函数 acos计算坐标(x,y)的对应关系。使用这种方法编出的程序短小精炼,体现了一定的技巧。 *程序说明与注释#include#includeint main()double y;int x,m;for(y=1;y=-1;y-=0.1) /*y为列方向,值从 1到-1,步长为 0.1*/m=acos(y)*10; /*计算出 y对应的弧度 m

3、,乘以 10为图形放大倍数*/for(x=1;x#include int main()double y;int x,m,n,yy;for(yy=0;yy#includeint main()double y;double x,m;for(y=10;y=-10;y-)m=2*sqrt(100-y*y); /*计算行 y对应的列坐标 m,2.5 是屏幕纵横比调节系数因为屏幕的行距大于列距,不进行调节显示出来的将是椭圆*/for(x=1;xint main()int integer,i,max,min,sum;max=-32768; /*先假设当前的最大值 max为 C语言整型数的最小值*/min=3

4、2767; /*先假设当前的最小值 min为 C语言整型数的最大值*/sum=0; /*将求累加和变量的初值置为 0*/for(i=1;imax)max=integer; /*通过比较筛选出其中的最高分*/if(integerint main()long i;int j;printf(“Please input number:“);scanf(“%ld“,for(j=999;j=100;j)if(i%j=0)printf(“The max factor with 3 digits in %ld is:%d,n“,i,j);break;*运行结果输入:555555输出:The max facto

5、r with 3 digits in 555555 is:777 6.高次方数的尾数求 13的 13次方的最后三位数*问题分析与算法设计解本题最直接的方法是:将 13累乘 13次方截取最后三位即可。但是由于计算机所能表示的整数范围有限,用这种“正确”的算法不可能得到正确的结果。事实上,题目仅要求最后三位的值,完全没有必要求 13的 13次方的完整结果。研究乘法的规律发现:乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。利用这一规律,可以大大简化程序。*程序说明与注释#includeint main()int i,x,y,last=1; /*变量 last保存求 X的

6、Y次方过程中的部分乘积的后三位*/printf(“Input X and Y(X*Y):“);scanf(“%d*%d“,for(i=1;iint main()int a,count =0;for(a=5;aint main()int a,b,c,count=0;printf(“There are diffrent methods for XM to distribute books to 3 readers:n“);for(a=1;a=2)当 J=1或 J=N+1时:其值为 1J!=1且 J!=N+1时:其值为第 N-1行的第 J-1个值与第 N-1行第 J个值之和将这些特点提炼成数学公式可

7、表示为:1 x=1或 x=N+1c(x,y)= c(x-1,y-1)+c(x-1,y) 其它本程序应是根据以上递归的数学表达式编制的。*程序说明与注释#includeint main()int i,j,n=13;printf(“N=“);while(n12)scanf(“%d“, /*控制输入正确的值以保证屏幕显示的图形正确*/for(i=0;ivoid printb(int,int);int main()int x;printf(“Input number:“);scanf(“%d“,printf(“number of decimal form:%dn“,x);printf(“ its bi

8、nary form:“);printb(x,sizeof(int)*8); /*x:整数 sizeof(int):int 型在内存中所占的字节数sizeof(int)*8:int型对应的位数*/putchar(n);void printb(int x,int n)if(n0)putchar(0+(unsigned)(x /*输出第 n位*/printb(x,n-1); /*归调用,输出 x的后 n-1位*/*运行结果输入:8输出:number of decimal form:8its bunary form:0000000000001000输入:-8输出:number of decimal f

9、orm:-8its binary form:1111111111111000输入:32767输出:number of decimal form:32767its binary form:0111111111111111输入:-32768输出:number of decimal form:-32768its binary form:1000000000000000输入:128输出:number of decimal form:128its binary form:0000000010000000 *问题的进一步讨论充分利用 C语言可以对位进行操作的特点,可以编写许多其它高级语言不便于编写甚至根本

10、无法编写的程序。位操作是 C语言的一大特点,在深入学习 C语言的过程中应力求很好掌握。程序中使用的位运算方法不是最佳的,也可以不用递归操作,大家可以自行对程序进行优化。*思考题将任意正整数转换为四进制或八进制数C/C+语言经典、实用、趣味程序设计编程百例精解(2)2007 年 06月 19日 星期二 00:4411.打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网” 。某人从 1990年 1月 1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网” 。*问题分析与算法设计根据题意可以将解题过程分为三步:1)计算从 1990年 1月 1日开始至指定日期共有多少天;2)由于“打

11、鱼”和“晒网”的周期为 5天,所以将计算出的天数用 5去除;3)根据余数判断他是在“打鱼”还是在“晒网” ;若 余数为 1,2,3,则他是在“打鱼”否则 是在“晒网”在这三步中,关键是第一步。求从 1990年 1月 1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为 29天,平年为 28天。闰年的方法可以用伪语句描述如下:如果 (年能被 4除尽 且 不能被 100除尽)或 能被 400除尽)则 该年是闰年;否则 不是闰年。C语言中判断能否整除可以使用求余运算(即求模)*程序说明与注释#includeint days(struct date day);struct dateint yea

12、r;int month;int day;int main()struct date today,term;int yearday,year,day;printf(“Enter year/month/day:“);scanf(“%d%d%d“, /*输入日期*/term.month=12; /*设置变量的初始值:月*/term.day=31; /*设置变量的初始值:日*/for(yearday=0,year=1990;year0for(i=1;iint main()int i;float total=0;for(i=0;i#includeint main()int i8,i5,i3,i2,i1,

13、n8,n5,n3,n2,n1;float max=0,term;for(i8=0;i8max)max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;printf(“For maxinum profit,he should so save his money in a bank:n“);printf(“ made fixed deposit for 8 year: %d timesn“,n8);printf(“ made fixed deposit for 5 year: %d timesn“,n5);printf(“ made fixed deposit for 3 y

14、ear: %d timesn“,n3);printf(“ made fixed deposit for 2 year: %d timesn“,n2);printf(“ made fixed deposit for 1 year: %d timesn“,n1);printf(“ Toal: %.2fn“,max);/*输出存款方式*/*运行结果For maxinum profit,he should so save his money in a bank:made fixed deposit for 8 year: 0timesmade fixed deposit for 5 year: 4ti

15、mesmade fixed deposit for 3 year: 0timesmade fixed deposit for 2 year: 0timesmade fixed deposit for 1 year: 0timesTotal:8841.01可见最佳的存款方案为连续四次存 5年期。*思考题某单位对职工出售住房,每套为 2万元。买房付款的方法是:一次交清,优惠 20%从第一年开始,每年年初分期付款:5年交清,优惠 50%;10年交清,优惠 10%;20年交清,没有优惠。现在有人手中正好有 2万元,若假定在今后 20年中物价和银行利率均保持不变,问他应当选择哪种付款方式可以使应付的钱最

16、少?15.捕鱼和分鱼A、B、C、D、E 五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。C、D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?*问题分析与算法设计根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。假定鱼的总数为 X,则 X可以按照题目的要求进行五次分配:X-1 后可被 5整除,余下的鱼为 4*(X-1

17、)、5。若 X满足上述要求,则 X就是题目的解。*程序说明与注释#includeint main()int n,i,x,flag=1; /*flag:控制标记*/for(n=6;flag;n+) /*采用试探的方法。令试探值 n逐步加大*/for(x=n,i=1iint main()int i,j,n=0,x; /*n为标志变量*/for(i=23;n=0;i+=2) /*控制试探的步长和过程*/for(j=1,x=i;j=11;j+) /*完成出售四次的操作*/if(x+1)%(j+1)=0) /*若满足整除条件则进行实际的出售操作*/x-=(x+1)/(j+1);else x=0;brea

18、k; /*否则停止计算过程*/if(j=5 /*输出结果*/n=1; /*控制退出试探过程*/*运行结果There are 59 fishes at first.*思考题日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将 2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的 1/8给老二;老二拿到后连同原先的桔子分 1/7给老三;老三拿到后连同原先的桔子分 1/6给老四;老四拿到后连同原先的桔子分 1/5给老五;老五拿到后连同原先的桔子分 1/4给老六;老六拿到后连同原先的桔子分 1/3给老大” 。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?17.平分七筐鱼甲

19、、乙、丙三位鱼夫出海打鱼,他们随船带了 21只箩筐。当晚返航时,他们发现有七筐装满了鱼,还有七筐装了半筐鱼,另外七筐则是空的,由于他们没有秤,只好通过目测认为七个满筐鱼的重量是相等的,7 个半筐鱼的重量是相等的。在不将鱼倒出来的前提下,怎样将鱼和筐平分为三份?*问题分析与算法设计根据题意可以知道:每个人应分得七个箩筐,其中有 3.5筐鱼。采用一个 3*3的数组 a来表示三个人分到的东西。其中每个人对应数组 a的一行,数组的第 0列放分到的鱼的整筐数,数组的第 1列放分到的半筐数,数组的第 2列放分到的空筐数。由题目可以推出:。数组的每行或每列的元素之和都为 7;。对数组的行来说,满筐数加半筐数

20、=3.5;。每个人所得的满筐数不能超过 3筐;。每个人都必须至少有 1 个半筐,且半筐数一定为奇数对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的,为了避免出现重复的分配方案,可以规定:第二个人的满筐数等于第一个人的满筐数;第二个人的半筐数大于等于第一个人的半筐数。*程序说明与注释#includeint a33,count;int main()int i,j,k,m,n,flag;printf(“It exists possible distribtion plans:n“);for(i=0;i3*/a00=i;for(j=i;j3*/a10=j;if(a20=7-j-a00)3)conti

21、nue; /*第三个人满筐数不能3*/if(a20=前一个人,以排除重复情况*/for(k=1;kint main()long int i;int count=0; /*count:统计满足条件的五位数的个数*/for(i=1000;iint main()int i;for(i=0;i+) /*试探商的值*/if(i*8+7)*8+1)*8+1=(34*i+15)*17+4) /*逆推判断所取得的当前 i值是否满足关系式*/*若满足则输出结果*/printf(“The required number is: %dn“,(34*i+15)*17+4);break; /*退出循环*/*运行结果Th

22、e required number is:1993 20.一个奇异的三位数一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。*问题分析与算法设计根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于 7,可设其七进制数形式为 kji(i、j、k 的取值分别为 16),然后设其九进制表示形式为 ijk。*程序说明与注释#includeint main()int i,j,k;for(i=1;iint main()int i;for(i=1002;iint main()int t,a5; /*数组 a存放分解的数字位*/l

23、ong int k,i;for(i=95860;i+) /*以 95860为初值,循环试探*/for(t=0,k=100000;k=10;t+) /*从高到低分解所取 i值的每位数*/ /* 字,依次存放于 a0a5中*/at=(i%k)/(k/10); k/=10;if(a0=a4)printf(“The velocity of the car is: %.2fn“,(i-95859)/2.0);break;*运行结果The new symmetrical number kelometers is:95959.The velocity of the car is:50.00*思考题将一个数的

24、数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过 1993的最大的二进制的对称数。23.由两个平方三位数获得三个平方二位数已知两个平方三位数 abc和 xyz,其中 a、b、c、x、y、z 未必是不同的;而 ax、by、cz 是三个平方二位数。请编程求三位数 abc和 xyz。*问题分析与算法设计任取两个平方三位数 n和 n1,将 n从高向低分解为 a、b、c,将 n1从高到低分解为x、y、z。判断 ax、by、cz 是否均为完全平方数。*程序说明与注释#include#includevoid f(int n,float* s);int main()in

25、t i,t;float a3,b3;print(“The possible perfect squares combinations are:n“);for(i=11;i=10;+s)*s = (n%k) /(k/10);k /=10;*运行结果The possible perfect squares combinations are:400 and 900841 and 196*思考题求这样一个三位数,该三位数等于其每位数字的阶乘之和。即 abc = a! + b! + c!(正确结果:145 = 1! + 4! +5!) 24.阿姆斯特朗数如果一个正整数等于其各个数字的立方和,则称该数为阿

26、姆斯特朗数(亦称为自恋性数)。如 407=43+03+73 就是一个阿姆斯特朗数。试编程求 1000以内的所有阿姆斯特朗数。*问题分析与算法设计可采用穷举法,依次取 1000以内的各数(设为 i),将 i的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。*程序说明与注释#includeint main()int i,t,k,a3;printf(“There are follwing Armstrong number smaller than 1000:n“);for(i=2;i=10;t+) /*截取整数 i的各位(从高向低位)*/at=(i%k)/(k/10); /*分别赋于 a0a2*

27、/k/=10;if(a0*a0*a0+a1*a1*a1+a2*a2*a2=i)/*判断 i是否为阿姆斯特朗数*/printf(“%5d“,i); /*若满足条件,则输出*/printf(“n“);*运行结果There are following Armstrong number smaller than 1000:153 370 371 407 25.完全数如果一个数恰好等于它的因子之和,则称该数为“完全数” 。*问题分析与算法设计根据完全数的定义,先计算所选取的整数 a(a的取值 11000)的因子,将各因子累加于 m,若 m等于 a,则可确认 a为完全数。*程序说明与注释#includei

28、nt main()int a,i,m;printf(“There are following perfect numbers smaller than 1000:n“);for(a=1;aint main()int a,i,b,n;printf(“There are following friendlynumbers pair smaller than 3000:n“);for(a=1;aint main()long mul,number,k,ll,kk;printf(“It exists following automorphic nmbers small than 200000:n“);f

29、or(number=0;number0;k*=10);/*由 number的位数确定截取数字进行乘法时的系数 k*/kk=k*10; /*kk为截取部分积时的系数*/mul=0; /*积的最后 n位*/ll=10; /*ll为截取乘数相应位时的系数*/while(k0)mul=(mul+(number%(k*10)*(number%ll-number%(ll/10)%kk;/*(部分积+截取被乘数的后 N位*截取乘数的第 M位),%kk 再截取部分积*/k/=10; /*k为截取被乘数时的系数*/ll*=10;if(number=mul) /*判断若为自守数则输出*/printf(“%ld “

30、,number);*运行结果It exsts following automorphic numbners smaller than 200000:0 1 5 6 25 76 376 625 9376 90625 109376 28.回文数打印所有不超过 n(取 nint main(void)int m16,n,i,t,count=0;long unsigned a,k;printf(“No. number its square(palindrome)n“);for(n=1;n=i)printf(“%2d%10d%10dn“,+count,n,n*n); return 0;*运行结果No. n

31、umber its square(palindrome)1 1 12 2 43 3 94 11 1215 22 4846 26 6767 101 102018 111 123219 121 1464110 202 4080411 212 44944/下面程序是原来的,有错,而且费解#includeint main(void)int m16,n,i,t,count=0;long unsigned a,k;printf(“No. number its square(palindrome)n“);for(n=1;n1;i)k+=mi-1*t;t*=10;if(k=n*n)printf(“%2d%10

32、d%10dn“,+count,n,n*n); return 0;*运行结果No. number its square(palindrome)1 1 12 2 43 3 94 11 1215 22 4846 26 6767 101 102018 111 123219 121 1464129.求具有 abcd=(ab+cd)2性质的四位数3025这个数具有一种独特的性质:将它平分为二段,即 30和 25,使之相加后求平方,即(30+25)2,恰好等于 3025本身。请求出具有这样性质的全部四位数。*问题分析与算法设计具有这种性质的四位数没有分布规律,可以采用穷举法,对所有四位数进行判断,从而筛选出

33、符合这种性质的四位数。具体算法实现,可任取一个四位数,将其截为两部分,前两位为a,后两位为 b,然后套用公式计算并判断。*程序说明与注释#includeint main()int n,a,b;printf(“There are following number with 4 digits satisfied conditionn“);for(n=1000;nint main()int n1,nm,i,j,flag,count=0;doprintf(“Input START and END=?“);scanf(“%d%d“, /*输入求素数的范围*/while(!(n10int main()int i,n;for(i=4;i=2000;i+=2)for(n=2;ni;n+) /*将偶数 i分解为两个整数*/if(fflag(n) /*分别判断两个整数是否均为素数*/if(fflag(i-n)printf(“%14d=%d+%dn“,i,n,i-n); /*若均是素数则输出*/break;if(n=i) printf(“error %dn“,i);

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报