[算法]有趣算法合辑[21-30]
题目21:有一分数序列:2/1,3/2。5/3,8/5。13/8,21/13...求出这个数列的前20项之和。
1.程序分析:请抓住分子与分母的变化规律。2.程序源码:
main() { int n,t,number=20; float a=2,b=1,s=0; for(n=1;n<=number;n++) { s=s+a/b; t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜t的作用*/ } printf("sum is %9.6f\n",s); }
题目22:求1+2!+3!+...+20!的和
1.程序分析:此程序仅仅是把累加变成了累乘。2.程序源码:
main() { float n,s=0,t=1; for(n=1;n<=20;n++) { t*=n; s+=t; } printf("1+2!+3!...+20!=%e\n",s); }
题目23:利用递归方法求5!。
1.程序分析:递归公式:fn=fn_1*4!2.程序源码:
#include "stdio.h" main() { int i; int fact(); for(i=0;i<5;i++) printf("\40:%d!=%d\n",i,fact(i)); } int fact(j) int j; { int sum; if(j==0) sum=1; else sum=j*fact(j-1); return sum; }
题目24:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第
3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后
问第一个人。他说是10岁。请问第五个人多大?
1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道
第四人的岁数,依次类推,推到第一人(10岁)。再往回推。
2.程序源码:
age(n) int n; { int c; if(n==1) c=10; else c=age(n-1)+2; return(c); } main() { printf("%d",age(5)); }
题目25:给一个不多于5位的正整数,要求:一、求它是几位数。二、逆序打印出各位数字。
1. 程序分析:学会分解出每一位数2.程序源码:
main( ) { long a,b,c,d,e,x; scanf("%ld",&x); a=x/10000;/*分解出万位*/ b=x%10000/1000;/*分解出千位*/ c=x%1000/100;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf("there are 5, %ld %ld %ld %ld %ld\n",e,d,c,b,a); else if (b!=0) printf("there are 4, %ld %ld %ld %ld\n",e,d,c,b); else if (c!=0) printf(" there are 3,%ld %ld %ld\n",e,d,c); else if (d!=0) printf("there are 2, %ld %ld\n",e,d); else if (e!=0) printf(" there are 1,%ld\n",e); }
题目26:一个5位数。推断它是不是回文数。即12321是回文数,个位与万位同样,十位与千位同样。
1.程序分析:同25例
2.程序源码:
main( ) { long ge,shi,qian,wan,x; scanf("%ld",&x); wan=x/10000; qian=x%10000/1000; shi=x%100/10; ge=x%10; if (ge==wan&&shi==qian)/*个位等于万位而且十位等于千位*/ printf("this number is a huiwen\n"); else printf("this number is not a huiwen\n"); }
题目27:对10个数进行排序
1.程序分析:能够利用选择法,即从后9个比較过程中,选择一个最小的与第一个元素交换,下次类推,即用第二个元素与后8个进行比較,并进行交换。
2.程序源码:
#define N 10 main() {int i,j,min,tem,a[N]; /*input data*/ printf("please input ten num:\n"); for(i=0;i<N;i++) { printf("a[%d]=",i); scanf("%d",&a[i]);} printf("\n"); for(i=0;i<N;i++) printf("%5d",a[i]); printf("\n"); /*sort ten num*/ for(i=0;i<N-1;i++) {min=i; for(j=i+1;j<N;j++) if(a[min]>a[j]) min=j; tem=a[i]; a[i]=a[min]; a[min]=tem; } /*output data*/ printf("After sorted \n"); for(i=0;i<N;i++) printf("%5d",a[i]); }
题目28:有一个已经排好序的数组。现输入一个数。要求按原来的规律将它插入数组中。
1. 程序分析:首先推断此数是否大于最后一个数,然后再考虑插入中间的数的情况。插入后此元素之后的数,依次后移一个位置。
2.程序源码:
main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("original array is:\n"); for(i=0;i<10;i++) printf("%5d",a[i]); printf("\n"); printf("insert a new number:"); scanf("%d",&number); end=a[9]; if(number>end) a[10]=number; else {for(i=0;i<10;i++) { if(a[i]>number) {temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) {temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } for(i=0;i<11;i++) printf("%6d",a[i]); }
题目29:将一个数组逆序输出。
1.程序分析:用第一个与最后一个交换。2.程序源码:
#define N 5 main() { int a[N]={9,6,5,4,1},i,temp; printf("\n original array:\n"); for(i=0;i<N;i++) printf("%4d",a[i]); for(i=0;i<N/2;i++) {temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp; } printf("\n sorted array:\n"); for(i=0;i<N;i++) printf("%4d",a[i]); }
题目30:打印出杨辉三角形(要求打印出10行例如以下图)
1.程序分析:1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
2.程序源码:
main() { int i,j; int a[10][10]; printf("\n"); for(i=0;i<10;i++) { a[i][0]=1; a[i][i]=1; } for(i=2;i<10;i++) for(j=1;j<i;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++) { for(j=0;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); } }