收藏 分享(赏)

经典C程序100例.doc

上传人:hwpkd79526 文档编号:7479414 上传时间:2019-05-19 格式:DOC 页数:107 大小:380KB
下载 相关 举报
经典C程序100例.doc_第1页
第1页 / 共107页
经典C程序100例.doc_第2页
第2页 / 共107页
经典C程序100例.doc_第3页
第3页 / 共107页
经典C程序100例.doc_第4页
第4页 / 共107页
经典C程序100例.doc_第5页
第5页 / 共107页
点击查看更多>>
资源描述

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

2、 度的图形是左右对称的,若定义图形的总宽度为 62 列,计算出 x 行 0180 度时 y 点的坐标 m,那么在同一行与之对称的 180360 度的 y 点的坐标就 应为 62-m。程序中利用反余弦函数 acos 计算坐标(x,y)的对应关系。使用这种方法编出的程序短小精炼,体现了一定的技巧。*程序说明与注释#include#includevoid 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,乘以 10 为图形放大倍数*/for(x=1;

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

4、min 为 C 语言整型数的最大值*/sum=0; /*将求累加和变量的初值置为 0*/for(i=1;imax)max=integer; /*通过比较筛选出其中的最高分 */if(integervoid 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 factor with 3 digi

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

6、程中的部分乘积的后三位*/printf(“Input X and Y(X*Y):“);scanf(“%d*%d“,for(i=1;i=2)当 J=1 或 J=N+1 时:其值为 1J!=1 且 J!=N+1 时:其值为第 N-1 行的第 J-1 个值与第 N-1 行第 J 个值之和将这些特点提炼成数学公式可表示为:1 x=1 或 x=N+1c(x,y)= c(x-1,y-1)+c(x-1,y) 其它 本程序应是根据以上递归的数学表达式编制的。*程序说明与注释#includevoid main()int i,j,n=13;printf(“N=“);while(n12)scanf(“%d“, /*

7、控制输入正确的值以保证屏幕显示的图形正确*/for(i=0;ivoid printb(int,int);void main()int x;printf(“Input number:“);scanf(“%d“,printf(“number of decimal form:%dn“,x);printf(“ its binary form:“);printb(x,sizeof(int)*8); /*x:整数 sizeof(int):int 型在内存中所占的字节数sizeof(int)*8:int 型对应的位数*/putchar(n); void printb(int x,int n)if(n0)pu

8、tchar(0+(unsigned)(x /*输出第 n 位*/printb(x,n-1); /*归调用,输出 x 的后 n-1 位 */*运行结果输入:8输出:number of decimal form:8its bunary form:0000000000001000输入:-8输出:number of decimal form:-8its binary form:1111111111111000输入:32767输出:number of decimal form:32767its binary form:0111111111111111输入:-32768输出:number of decim

9、al form:-32768its binary form:1000000000000000输入:128输出:number of decimal form:128its binary form:0000000010000000 _11.打鱼还是晒网中国有句俗语叫“三天打鱼两天晒网” 。某人从 1990 年 1 月 1 日起开始“三天打鱼两天晒网” ,问这个人在以后的某一天中是“打鱼”还是“晒网” 。*问题分析与算法设计根据题意可以将解题过程分为三步:1)计算从 1990 年 1 月 1 日开始至指定日期共有多少天;2)由于“打鱼”和“晒网”的周期为 5 天,所以将计算出的天数用 5 去除;3)

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

11、oid 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;ivoid main()int i;float total=0;for(i=0;i#includevoid main()int i8,i5,i3,i2,i1,n8,n5,n3,n2,n1;flo

12、at 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 year: %d timesn“,n3

13、);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: 4timesmade fixed depo

14、sit 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 年中物价和银行利率均保持不变,问他应当选择哪种付款方式可以使应付的钱最少? - 15.捕鱼

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

16、5。若 X 满足上述要求,则 X 就是题目的解。*程序与程序注释#includevoid main()int n,i,x,flag=1; /*flag:控制标记*/for(n=6;flag;n+) /*采用试探的方法。令试探值 n 逐步加大*/for(x=n,i=1ivoid 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

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

18、子? 1.7 分数四则运算对输入的两个分数进行+、-、*、/四则运算,输出分数结果。算法分析如下:对分数 b/a 与 d/c,不管哪一种运算,其运算结果均为 y/x 形式。对结果 y/x 进行化简,约去分子分母的公因数:试用 i(i=1,.,y)对 y,x 进行试商,若能同时整除 y,x,则 y,x 同时约去公因数 i,最后打印约简的分数。程序代码如下:#includevoid main()long int a,b,c,d,i,x,y,z;char op;printf(“两分数 b/a,d/c 作 +,- ,* ,/ 四则运算,结果为分数。 n“);printf(“请输入分数运算式。n“);s

19、canf(“%ld/%ld%c%ld/%ld“,if(a=0|c=0) printf(“分母为 0 输入错误!“);exit(0);if(op=+)y=b*c+d*a;x=a*c; /*运算结果均为 y/x*/if(op=-)y=b*c-d*a,x=a*c;if(op=*)y=b*d;x=a*c;if(op=/)y=b/c;x=a/d;z=x;if(xy) z=y;i=z;while(i1) /*y/x 分子分母约去公因数*/if(x%i=0y=y/i;continue;i-;printf(“%ld/%ld%c%ld/%ld=%ld/%ld.n“,b,a,op,d,c,y,x); 17.平分七

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

21、来说,满筐数加半筐数=3.5;。每个人所得的满筐数不能超过 3 筐;。每个人都必须至少有 1 个半筐,且半筐数一定为奇数对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的,为了避免出现重复的分配方案,可以规定:第二个人的满筐数等于第一个人的满筐数;第二个人的半筐数大于等于第一个人的半筐数。*程序与程序注释#includeint a33,count;void 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

22、-a00)3)continue; /*第三个人满筐数不能 3*/if(a20=前一个人,以排除重复情况*/for(k=1;kvoid main()long int i;int count=0; /*count:统计满足条件的五位数的个数*/for(i=1000;ivoid 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;

23、 /*退出循环*/*运行结果The required number is:199320.一个奇异的三位数一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。*题目分析与算法设计根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于 7,可设其七进制数形式为 kji(i、j、k 的取值分别为 16),然后设其九进制表示形式为 ijk。*程序说明与注释#includevoid main()int i,j,k;for(i=1;ivoid main()int i;for(i=1002;ivoid main()int t,a5;

24、 /*数组 a 存放分解的数字位*/long 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

25、car is:50.00 *思考题将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过 1993 的最大的二进制的对称数 23.阿姆斯特朗数如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数) 。如 407=43+03+73 就是一个阿姆斯特朗数。试编程求 1000 以内的所有阿姆斯特朗数。*题目分析与算法设计可采用穷举法,依次取 1000 以内的各数( 设为 i),将 i 的各位数字分解后,据阿姆斯特朗数的性质进行计算和判断。*程序说明与注释#includevoid main()int i,t,k,a3;printf(“

26、There are follwing Armstrong number smaller than 1000:n“);for(i=2;i=10;t+) /*截取整数 i 的各位(从高向低位)*/at=(i%k)/(k/10); /*分别赋于 a0a2*/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

27、24.完全数如果一个数恰好等于它的因子之和,则称该数为“完全数” 。*题目分析与算法设计根据完全数的定义,先计算所选取的整数 a(a 的取值 11000)的因子,将各因子累加于m,若 m 等于 a,则可确认 a 为完全数。*程序说明与注释#includevoid main()int a,i,m;printf(“There are following perfect numbers smaller than 1000:n“);for(a=1;avoid main()int a,i,b,n;printf(“There are following friendly-numbers pair smal

28、ler than 3000:n“);for(a=1;avoid main()long mul,number,k,ll,kk;printf(“It exists following automorphic nmbers small than 200000:n“);for(number=0;number0;k*=10);/*由 number 的位数确定截取数字进行乘法时的系数 k*/kk=k*10; /*kk 为截取部分积时的系数*/mul=0; /*积的最后 n 位*/ll=10; /*ll 为截取乘数相应位时的系数*/while(k0)mul=(mul+(number%(k*10)*(numb

29、er%ll-number%(ll/10)%kk;/*(部分积+截取被乘数的后 N 位*截取乘数的第 M 位),%kk 再截取部分积*/k/=10; /*k 为截取被乘数时的系数*/ll*=10;if(number=mul) /*判断若为自守数则输出*/printf(“%ld “,number);*运行结果It exsts following automorphic numbners smaller than 200000:0 1 5 6 25 76 376 625 9376 90625 10937628.回文数打印所有不超过 n(取 nvoid main()int m16,n,i,t,coun

30、t=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%10d%10dn“,+count,n,n*n); *运行结果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 这个数具有一种独特的性质:将它

31、平分为二段,即 30 和 25,使之相加后求平方,即(30+25)2,恰好等于 3025 本身。请求出具有这样性质的全部四位数。*题目分析与算法设计具有这种性质的四位数没有分布规律,可以采用穷举法,对所有四位数进行判断,从而筛选出符合这种性质的四位数。具体算法实现,可任取一个四位数,将其截为两部分,前两位为 a,后两位为 b,然后套用公式计算并判断。*程序说明与注释#includevoid main()int n,a,b;printf(“There are following number with 4 digits satisfied conditionn“);for(n=1000;nvoi

32、d main()int n1,nm,i,j,flag,count=0;doprintf(“Input START and END=?“);scanf(“%d%d“, /*输入求素数的范围*/while(!(n10void main()int i,n;for(i=4;i#include#define NUM 320int numberNUM; /*存放不超过 1993 的全部奇数*/int fflag(int i);void main()int i,j,count=0;printf(“there are follwing primes sequences in first row:n“);for

33、(j=0,i=3;i1898;j-) /*从最大的素数开始向 1898 搜索*/for(i=0;numberj-number1898;i+); /*循环查找满足条件的素数*/if(numberj-number=1898) /*若两个素数的差为 1898,则输出*/printf(“(%d).%3d,.,%dn“,+count,number,numberj); int fflag(int i)int j;if(i#includeint number2105; /*存放可逆素数及素数分解后的各位数字*/int select110; /*可以放在矩阵第一行和最后一行的素数的下标*/ int array

34、45; /*4X4 的矩阵,每行 0 号元素存可逆素数对应的数组下标*/int count; /*可逆素数的数目*/int selecount; /*可以放在矩阵第一行和最后一行的可逆素数的数目*/int larray2200; /*存放素数前二、三位数的临时数组所对应的数量计数器*/int lcount2;int num(int number);int ok(int number);void process(int i);void copy_num(int i);int comp_num(int n);int find1(int i);int find2(void);int find0(in

35、t num);void p_array(void); void main()int i,k,flag,cc=0,i1,i4;printf(“there are magic squares with invertable primes as follw:n“);for(i=1001;i0;number/=10) /*将素数变为反序数*/j=j*10+number%10;if(!ok(j) return 0; /*判断反序数是否为素数*/return 1; int ok(int number) /*判断是否为素数*/int i,j;if(number%2=0) return 0;j=sqrt(do

36、uble)number)+1;for(i=3;i=1;j-,num/=10)numberj=num%10; void copy_num(int i) /*将 array0指向的素数的各位数字复制到 array 中*/int j;for(j=1;jj; int comp_num(int n) /*判断 array 中每列的前 n 位是否与可逆素数允许的前 n 位矛盾*/static int ii; /*用内部静态变量保存前一次查找到的元素下标*/static int jj; /*ii:前一次查找前二位的下标,jj:前一次查找前三位的下标*/int i,num,k,*p; /*p:指向对应的要使用

37、的前一次下标 ii 或 jj*/int *pcount; /*pcount:指向要使用的临时数组数量的计数器*/switch(n) /*根据 n 的值选择对应的一组控制变量*/case 2:pcount=p=break;case 3:pcount=p=break;default:return 0;for(i=1;i=0(*p)+); /*否则向后找*/if(*p=*pcount)*p=0; return 0;if(num!=larrayn-2*p)return 0; /*前 n 位不是可逆素数允许的值则返回 0*/return 1; int find1(int i) /*判断列方向是否是可逆素数 */int num,j;for(num=0,j=0;j4;j+)num=num*10+arrayj;return find0(num); int find2(void) /*判断对角线方向是否是可逆素数 */int num1,num2,i,j;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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