C程序基本算法.doc

上传人:小小飞 文档编号:5014197 上传时间:2020-01-28 格式:DOC 页数:49 大小:286.50KB
返回 下载 相关 举报
C程序基本算法.doc_第1页
第1页 / 共49页
C程序基本算法.doc_第2页
第2页 / 共49页
C程序基本算法.doc_第3页
第3页 / 共49页
C程序基本算法.doc_第4页
第4页 / 共49页
C程序基本算法.doc_第5页
第5页 / 共49页
点击查看更多>>
资源描述

《C程序基本算法.doc》由会员分享,可在线阅读,更多相关《C程序基本算法.doc(49页珍藏版)》请在三一文库上搜索。

1、八、文件、C程序基本算法一、求和算法1. 求1+2+3+100的值。#include stdio.hvoid main()int i,sum=0;i=1;while(i=100)/*当i=100时,执行循环体*/sum=sum+i;i+;printf(%dn,sum);2. 求1+3+5+7+9+100的值。#include stdio.hvoid main()int i,sum=0;i=1;for(i=1;i=100;i+=2)/*每次增加2 */sum=sum+i;printf(%dn,sum);3. 求满足1+2+3+n1000的最大n值。解1:#includevoid main()in

2、t n,s;s=0;for(n=1;n1000)break;printf(n=%dn,n-1);解2:#includevoid main()int k,n,s;s=0;n=1;while(s1000)k=n;n+;s=s+n;printf(n=%dn,k);4. 求1+22+32+42+102。#include stdio.hvoid main()int n,s;s=0;for(n=1;n=10;n+)s=s+n*n;printf(s=%dn,s);5. 求1+(1+2)+(1+2+3)+(1+2+3+10)的值。解法1(用双循环)#includemain() int i,t,s; s=0;

3、for(i=1;i=5;i=i+1) t=0;for(j=1;j=i;j+)t=t+j;s=s+t;printf(%dn,s);解法2(用单循环)#includemain() int i,j,t,s; s=0; t=0; for(i=1;i=5;i=i+1) t=t+i;s=s+t;printf(%dn,s);6. 求1+1/3+1/5+1/7+1/99的值。#include stdio.hvoid main()float i,s;s=0;for(i=1;i=99;i+=2)s=s+1/i;printf(s=%fn,s);7. 求1+1/32+1/52+1/72+1/992的值。#includ

4、e stdio.hvoid main()float i,s;s=0;for(i=1;i=99;i+=2)s=s+1/(i*i);printf(s=%fn,s);8. 求1-1/2+1/3-1/4+1/99的值。#include stdio.hvoid main() int s; float i,t,p; p=1;s=1;/*第一项1,作为累加变量的初值*/ for(i=2;i=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(pi=%10.6fn,pi);解:用语句:s=-s,控制各项和符号。10. 求1+3/5+5/9+7/13+97/19

5、3的值。#include stdio.hvoid main()float i,t,s;s=1;for(i=3;i=97;i+=2)s=s+i/(2*i-1);printf(s=%fn,s);11. 求1-3/5+5/9-7/13+-97/193的值。#include stdio.hvoid main()float i,p,t,s;s=1;p=1;for(i=3;i=5;i+=2)s=-s;p=p+s*i/(2*i-1);printf(p=%fn,p);12. 求121222324263之值。解1:#include#include/*求幂pow( ),要用此头函数*/void main()int

6、 i;double s;s=0;for(i=0;i=63;i+)s=s+pow(2,i);printf(%en,s);解2:#includevoid main()int i;double n,s;n=1;s=1;for(i=1;i=63;i+)n=n*2;s=s+n;printf(%en,s);13. 求11/31/32/51/32/53/71/32/53/74/9前10项之和。#includevoid main()int i;double a,b,t,s;a=0,b=1;t=1;s=0;for(i=1;i=10;i+)s=s+t;a=a+1;b=b+2;t=t*a/b;printf(%lfn

7、,s);14. 求用下列级数的前21项之和计算自然对数之底的近似值。1,1/1!,1/2!,1/3!,1/(N-1)!#includevoid main()int i;double t,s;t=1;s=1;/*第一项赋为初值*/for(i=1;i=20;i+)t=t*i;/*分母连乘*/s=s+1/t;printf(%lfn,s);15. 求11223448n2n-1前10项之和。解1:#include#include/*求幂pow( ),要用此头函数*/void main()int i,s;s=0;for(i=1;i=10;i+)s=s+i*pow(2,i-1);printf(%dn,s);

8、解2:#includevoid main()int i,n,s;n=1;s=0;for(i=1;i=10;i+)s=s+i*n;n=n*2;printf(%dn,s);16. 求10! 的值。#includevoid main()int i; long t; t=1; for(i=1;i=10;i+) t=t*i;/求i的阶乘printf(%ldn,t);17. 编一程序求1!+3!+5!+7!+9!。#includevoid main() int i,j;long t,s; s=0; for(i=1;i=9;i=i+2) t=1;for(j=1;j=i;j+)/求i的阶乘t=t*j;s=s+

9、t;/累加i的阶乘printf(%ldn,s);18. 求1!+2!+3!+20!的值。解法1(用单循环):#includevoid main()int i; double t,s; s=0; t=1; for(i=1;i=20;i+) t=t*i;/求i的阶乘 s=s+t;/累加i的阶乘printf(%en,s);解法2(用双循环):#includevoid main()int i,j; double t,s; s=0; for(i=1;i=20;i+) t=1; for(j=1;j=i;j+)/求i的阶乘 t=t*j; s=s+t;/累加i的阶乘printf(%en,s);19. 求1+1

10、/2!+1/3!+1/4!+,前10项之和。#includevoid main()int i; double t,s; s=0; t=1; for(i=1;i=10;i+) t=t*i;/求i的阶乘 s=s+1/t;/累加i的阶乘的倒数printf(%lfn,s);20. 求a+aa+aaa+aaaa+aaaaa+的值,其中a和项数由自己确定。#include stdio.hvoid main()int a,n,s=0,t=0,k=1;printf(input a,n:);scanf(%d,%d,&a,&n);while(k=n)t=t*10+a;s=s+t;k+;printf(a=%d,n=

11、%dn,a,n);printf(a+aa+aaa+aaaa.=%dn,s);21. 求分数序列2/1,3/2,5/3,8/5,13/8,前20项之和。(后一项的分子,等于前一项分子与分母之和)#include stdio.hvoid main() int n,t;float a=2,b=1,s=0;for(n=1;n=20;n+)s=s+a/b; t=a;/*先把分子a赋给t暂时保存*/a=a+b;/*把a+b赋给后一个分子a*/b=t;/*再把暂存的前一个分子,赋给后一个分母*/printf(s=%fn,s);22. 求分数序列1/2,2/3,3/5,5/8,8/13,前20项之和。(后一项

12、的分母,等于前一项分子与分母之和)#include stdio.hvoid main() int n,t;float a=1,b=2,s=0;for(n=1;n=4;n+)s=s+a/b; t=b;/*先把分母赋给t暂时保存*/b=a+b;/*把a+b赋给后一个分母b*/a=t;/*再把暂存的前一个分母,赋给后一个分子*/printf(s=%fn,s);23. 判断输入的一个整数是否能被3或7整除,若能整除输出“YES”否则输出“NO”#include stdio.hvoid main()int k; printf(Enter a int number:); scanf(%d,&k); if(

13、 k%3= =0|k%7= =0 )printf(YESn); elseprintf(NOn);24. 一个数用3除余2,用5除余3,用7除余5,求出其中最小的一个数。#include stdio.hvoid main()long n;n=1;while(1)if(n%3=2&n%5=3&n%7=5)break;n+;printf(n=%ldn,n);25. 求出1000以内的3除余2,5除余3,7除余2的数。#include stdio.hvoid main()int n;for(n=1;n1000;n+)if(n%3=2&n%5=3&n%7=2)printf(n=%dn,n);26. 下面

14、程序从读入的整数数据中,统计大于0的整数个数i和小于0的整数个数j,当输入0时,程序运行结束。#includevoid main() int n,i,j;printf(“Input int numbers,with 0 to end:”); i=j=0; scanf (“%d”,&n);while ( n!=0 )if (n0) i= i+1 ;if (n0) j= j+1 ;scanf(“%d”,&n); /*继续输入下一个数*/printf(“i=%d,j=%dn”,i,j );27. 下面程序输入一个学生的生日(年:y0,月:m0,日:d0),并输入当前日期(年:y1,月:m1,日:d1

15、)。求出该学生的实足年龄。#includemain()int age,y0,m0,d0,y1,m1,d1; printf(输入生日日期(年、月、日)); scanf(%d,%d,%d, &y0,&m0,&d0 ); printf(输入当前日期(年、月、日)); scanf(%d,%d,%d, &y1,&m1,&d1 ); age=y1-y0; if( m0 m1 ) age-;/如果出生月份当前月份,年龄减1岁 if ( m0 = = m1 )&( d0 d1 ) age-;/*如果出生月份=当前月份,但出生日当前日,年龄减1岁*/ printf(age=%3dn,age);28./*若输入2

16、003年3月5日,则输出是2003年第64天*/*反过来,若输入2003年第64天,则输出3月5日*/#includeint day_tab13=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31,;void main(void)int day_of_year(int year,int month,int day);int month_day(int year,int yearday);int y,m,d;printf(Input year,month,day:);scanf(%d,%d,%d,

17、&y,&m,&d);printf(%d年第%d天n,y,day_of_year(y,m,d);/*打印天数*/printf(Input year,dayth:);scanf(%d,%d,&y,&d);month_day(y,d);/*求月份数、当月第几天*/int day_of_year(int year,int month,int day)/*输入年、月、日,求是该年第几天*/int i,leap;/*闰年leap=1,非闰年leap=0*/leap=year%4=0&year%100=0|year%400=0;for(i=1;iday_tableapi;i+)yearday-=day_ta

18、bleapi;/*若是2003年第64天,则减去1月,2月的天数*/ /*i是月份数,剩下的yearday是当月天数*/printf(%d月,i);/*打印月份*/printf(%d日n,yearday);/*打印天数*/*运行情况:Input year,month,day:2003,3,52003年第64天Input year,dayth:2003,643月5日*/29.二、枚举法1. (枚举法)求解百鸡问题。鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?#include stdio.hvoid main()int x,y,z; for(x=1;x18;x

19、+) for(y=1;y31;y+) z=100-x-y; if(5*x+3*y+z/3.0=100)/C语言中不能除以3 printf(cock=%d,hen=%d,chick=%dn,x,y,z); 2. (枚举法)求满足ijk+kji=1333的i,j,k的值(i,j,k均是一位数)。此问题实际是:一个三位数,三位数字顺排倒排组成的两个三位数之和等于1333,求这个三位数的三位数字。#includevoid main()int i,j,k;for(i=1;i=9;i+)for(j=0;j=9;j+)for(k=1;k=9;k+)if(i*100+j*10+k)+(k*100+j*10+i

20、)=1333)printf(i=%d,j=%d,k=%dn,i,j,k);3.4.三、排序1. 以下程序不用第三个变量,实现将两个数进行对调的操作。#include “stdio.h”main()int a,b; scafn(“%d%d”,&a,&b); printf(“a=%d,b=%dn”,a,b); a=a+b;b=a-b;a=a-b; printf(“a=%d,b=%dn”,a,b);2. 选择法排序#include void main()void sort();int i,j,k,t,a10;printf(enter array a10);for(i=0;i10;i+)scanf(%

21、d,&ai);for(i=0;i10;i+)k=i;for(j=i+1;jak) k=j;if(k!=i)t=ai;ai=ak;ak=t;for(i=0;i10;i+)printf(%d ,ai);printf(n);3. 冒泡法排序#include stdio.hvoid main()int a11;/*不用0下标,故定义a11*/int i,j,t;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,&ai);printf(n);for(j=1;j=9;j+)/*控制比较的轮数为9轮*/for(i=1;iai+1)/*若上面元素大于下面的元

22、素,则交换*/t=ai;ai=ai+1;ai+1=t;printf(The sortted numbers:n);for(i=1;i11;i+)printf(%d ,ai);printf(n);getch();4. D5.四、数组1. (最大数、最小数)求出十个数中的最大数,最小数及其序号。#include stdio.hvoid main()int a10=1,-3,-7,9,11,0,4,32,25,10;int i,max,min,n1,n2;printf(array a: );for(i=0;i9;i+)printf(%d,ai);/*注意输出格式的控制*/printf(%dn,ai)

23、;printf(n);max=min=a0;n1=n2=0;/*设0号元素最大、最小,n1,n2记序号*/for(i=1;imax)/*若ai大于max*/max=ai;/*把ai赋给max*/n1=i;/*同时用n1记最大数的序号i*/else/*否则*/if(aimin)/*若ai小于min*/min=ai;/*把ai赋给min*/n2=i;/*同时用n2记最小数的序号i*/printf(max is: a%d=%dn,n1,max);printf(min is: a%d=%dn,n2,min);2. 求出Fibonacci数列的前20项。#include stdio.hvoid main

24、()int i;int f20=1,1;/*为第0,1项赋值*/for(i=2;i20;i+)/*从第2项起*/fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)/*若i是5的倍数,则换行*/printf(n);printf(%12d,fi);printf(n);3. 求出Fibonacci数列中小于10000的项中最大的一个项。解法1:#include stdio.hvoid main()int i;long k,f100=1,1;/*下标应大一些*/i=1;while(fi10000)k=fi;/*用k 记小于10000的项,最后一次的k就是答案*/i+;fi=fi

25、-2+fi-1;printf(%ldn,k);解法2:#include stdio.hvoid main()int i;long k,f100=1,1;/*下标应大一些*/i=1;while(fi=10000时,才停止循环*/i+;fi=fi-2+fi-1;printf(%ldn,fi-1);/*输出第i -1项:fi-1*/4. 求出Fibonacci数列中大于10000的项中最小的一个项。#include stdio.hvoid main()int i;long k,f100=1,1;/*下标应大一些*/i=1;while(fi=10000时,才停止循环*/i+;fi=fi-2+fi-1;

26、printf(%ldn,fi);/*第i 项是大于1000的第一项*/5. (矩阵中最大数)求出矩阵中的最大数,最小数及其在矩阵中的位置。#include stdio.hvoid main()int i,j,row,colum;float max,a34=1,2,3,4,9,8,7,6,-10,10,-5,2;max=a00;row=0;colum=0;for(i=0;i=2;i+)for(j=0;jmax)max=aij;row=i;colum=j;printf(max is: a%d%d=%5.1fn,row,colum,max); getch();6. 求矩阵中每行的最大数及其位置。#i

27、nclude stdio.hvoid main()int i, j, max, row, col; static int a33=3,5,6,2,1,4,8,7,1; printf(Orignal array is:n); for(i=0;i3;i+) for(j=0;j3;j+) printf(%3d,aij); printf(n); printf(n); for(i=0; i3; i+) max=ai0; row=i; col=0;/令当前最大的数为本行第0号元素,记下行、列号for(j=1; jmax) max=aij; row=i; col=j; printf(a%d%d=%dn, r

28、ow, col, max); 7. 求矩阵中每列的最大数及其位置。#include stdio.hvoid main()int i, j, max, row, col; static int a33=3,5,6,2,1,4,8,7,1; printf(orignal array:n); for(i=0;i3;i+) for(j=0;j3;j+) printf(%3d,aij); printf(n); printf(Max is:n); for(j=0; j3; j+) max=a0j; row=0; col=j;/令每列第0行元素最大,记下行、列号for(i=1; imax) max=aij;

29、 row=i; col=j; printf(a%d%d=%dn, row, col, max); 8. (最大公约数)求两个整数的最大公约数和最小公倍数。#include void main()int m,n,p,r;printf(Enter m,n:);scanf(%d,%d,&m,&n);if(n=0) return;p=m*n;while(r=m%n)m=n; n=r;printf(最大公约数:%dn,n);printf(最小公倍数:%dn,p/n);9. (素数)求出1到100之间的全部素数,要求每行输出10个素数。#include #include #define N 100void

30、 main()int m,k,i,n=0;for(m=2;m=N;m=m+1)/*m从2到100*/k=sqrt(m);for(i=2;i=k+1)/*如果i=k+1,则m是素数*/ printf(%6d,m);n=n+1;/*打印一个,记一个数*/if(n%5=0) printf(n);/*打印5个后,换行*/ printf(n);10. (筛法)求1到100之间的全部素数,要求每行输出10个素数。算法:(1)先把1挖掉。(下面从2开始)(2)用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。令aj=0(3)用3去除它后面的各个数,把3的倍数挖掉。(4)用4,5,去除它后面的各

31、个数,把它们的倍数挖掉。(5)最后,下标i从2开始,如果ai0,则输出。#include stdio.h#include math.hvoid main()int i,j,n,a101;for(i=1;i=100;i+) ai=i; for(i=2;isqrt(100);i+) for(j=i+1;j=100;j+) if(ai!=0&aj!=0)if(aj%ai= =0)aj=0; n=0; for(i=2;i=100;i+) if(ai!=0) printf(%5d,ai); n+; if(n= =10)/*输出了10个,则换行*/ printf(n); n=0; printf(n);11

32、. (猴子吃桃)有一数列,其后一项比前一项的二分之一小一,请编程序求出这个数列的前十项。解法1:#include void main()int day,x1,x2;day=10;x1=1;/*第一天是1个桃子*/while(day1)x2=2*(x1+1);/*求第二天的桃子数*/x1=x2;/*把第二天的桃子数,作为下一个第一天的桃子数*/day-;/*天数减1*/printf(num=%d个n,x2);解法2:#include void main()int day,n=1;for(day=2;day=10;day+)n=2*(n+1);printf(n=%d个n,n);解法3:#inclu

33、devoid main()int day,x;day=1,x=1;while(day10)x=(x+1)*2;day+;printf(x=%d个n,x);12. (逆序存放数组)将一个数组中的值按逆序存放#include #define N 5void main()int i,j,t;int aN;printf(input a5:);for(i=0;iN;i+)scanf(%d,&ai);for(i=0,j=N-1;ij;i+,j-)/*当ij 时*/t=ai;ai=aj;aj=t;/*交换两端的元素*/for(i=0;ix) ai+1=ai;i-;/如果aix,则把ai向后移动一位 a+i=x;/第i位放x的值 n+; for(i=0;i=n;i+) printf(%4d,ai); printf(n); 解法2:#include stdio.hvoid main()int a11, num, i, j; printf(input a10:); for(i=0;i10;i+)scanf(%d,&ai); for(i=0;i10;i+)printf(%

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

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1