[算法]有趣算法合辑[21-30]

来源:互联网 发布:kafka 数据粒度 编辑:程序博客网 时间:2024/06/16 06:50

题目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 10main(){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 5main(){ 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");  }}


12 0
原创粉丝点击