C语言经典21-30题

                  21.猴子吃桃问题

22.两个乒乓球队进行比赛,各出三人 

23.打印出如下图案(菱形)

24.:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和

 25.求1+2!+3!+...+20!的和

26.利用递归方法求5!

27.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来

28.有5个人坐在一起,问第五个人多少岁? 

 29.给n位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字

 30.回文数

21.猴子吃桃问题

 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。22.两个乒乓球队进行比赛,各出三人

#include <stdio.h>
double diGui(int n);

int main(){
	int n=1;
	printf("第一天共摘了%f",diGui(n));
	
	return 0;
}
//写一个递归函数
double diGui(int n){
	double sum;
	if(n==10)
		sum=1;
	else
		sum = ((diGui(n+1)+1)*2);	
		
	return sum;
}

结果:
    第一天共摘了1534.000000

22.两个乒乓球队进行比赛,各出三人 

 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定
比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
三队赛手的名单。 
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 

#include <stdio.h>

int main(){
	char i,j,k;
	
	for(i='x'; i<='z';i++)
		for(j='x'; j<='z'; j++)
			for(k='x'; k<='z';k++)
				if(i!=j && i!=k && j!=k)
					if(i!='x'&& k!='x' && k!='z')
						printf("a--%c,b--%c--,c--%c",i,j,k);
	
	return 0;					
}

结果:
    a--z,b--x--,c--y

23.打印出如下图案(菱形)

#include <stdio.h>

int main(){
	
	int n=9,i,j,k;
	
	for(i=1;i<=n;i++){  //这个i表示有多少行
		if(i<(n-1)/2+1){
			for(j=1;j<=(n-1)/2-i;j++)
				printf(" ");
			for(k=1;k<=2*i-1;k++)
				printf("*");				
		}else{
			for(j=0;j<=(i-(((n-1)/2+1)));j++)
				printf(" ");
			for(k=1;k<=((n-1)/2+1)-(i-((n-1)/2+1))*2;k++)
				printf("*");
		}
		
	printf("\n");	
	}
}

   *
  ***
 *****
*******
 *****
  ***
   *

24.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和

#include <stdio.h>

double sum(int n);

int main(){
	int n;
	printf("求这个数列第n项,n=");
	scanf("%d",&n);
	
	printf("2/1+3/2+......=%lf",sum(n));
	
	return 0;
}
double sum(int n){
	int  temp,i;
	double fenzi=2, fenmu=1, sum=0;
	for(i=0; i<n; i++){
		sum += fenzi/fenmu;
		temp = fenzi;
		fenzi = fenzi+fenmu;
		fenmu = temp;
	}
	
	return sum;
}

结果:
    求这个数列第n项,n=20
    2/1+3/2+......=32.660261

 25.求1+2!+3!+...+20!的和

程序分析:此程序只是把累加变成了累乘。

#include <stdio.h>
long factorial(int n);

int main(){
	int n;
	printf("求多大的阶乘n=");
	scanf("%d",&n);
	
	printf("1+2!+3!+..=%ld",factorial(n));
	
	return 0;
}

//阶乘
long factorial(int n){
	int i, sum=1;
	long  sums=0;
	for(i=1;i<=n;i++){
		sum *= i;  //最巧妙的地方!!!!
		sums += sum;	
	}
	return sums;	
}

结果:
       求多大的阶乘n=3
       1+2!+3!+..=9

26.利用递归方法求5!

#include <stdio.h>

int diGui(int n);
int main(){
	int n;
	printf("请输入你想要的递归数n=");
	scanf("%d",&n);
	
	printf("1!+2!+...%d!=%d",n,diGui(n));
	
	return 0;
}
//递归函数
int diGui(int n){
	int sum;
	if(n==1)
		sum=1;
	else
		sum=n*diGui(n-1); 
	
	return sum;	
}

结果:
    请输入你想要的递归数n=5
    1!+2!+...5!=120

27.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来

#include <stdio.h>

int isNumber(int n);
int niNumber(int n);

int main(){
	int number;
	printf("请输入数字number=");
	scanf("%d",&number);
	printf("输入的数字是%d位数\n",isNumber(number));
	printf("逆序打印出的数字为%d",niNumber(number));
	
	return 0;	
}

//求它是几位数
int isNumber(int n){
	int count=0;
	while(n!=0){
		n/=10;
		count++;
	}
	return count;
}

//逆序打印数字
int niNumber(int n){
	int m, sum=0;
	while(n!=0){
		m = n%10;
		sum = sum*10 + m;
		n /= 10;
	}
	return sum;
}

结果:
    请输入5个字符 : abcde
    相反顺序输出结果 : edcba

28.有5个人坐在一起,问第五个人多少岁? 

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

#include <stdio.h>
int yearRecursion(int n);
//recursion:递归

int main(){
	int n;
	printf("有多少个人这样说n=");
	scanf("%d",&n);
	
	printf("第%d个人的岁数是%d",n,yearRecursion(n));
	
	return 0;
}
//设置一个递归函数
int yearRecursion(int n){
	int age;
	if(n==1)
		age=10;
	else
		age=yearRecursion(n-1)+2;	
	
	return age;
}

结果:
    有多少个人这样说n=5
    第5个人的岁数是18

 29.给n位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字

#include <stdio.h>

int isNumber(int n);
int niNumber(int n);

int main(){
	int number;
	printf("请输入数字number=");
	scanf("%d",&number);
	printf("输入的数字是%d位数\n",isNumber(number));
	printf("逆序打印出的数字为%d",niNumber(number));
	
	return 0;	
}

//求它是几位数
int isNumber(int n){
	int count=0;
	while(n!=0){
		n/=10;
		count++;
	}
	return count;
}

//逆序打印数字
int niNumber(int n){
	int m, sum=0;
	while(n!=0){
		m = n%10;
		sum = sum*10 + m;
		n /= 10;
	}
	return sum;
}

结果:
    请输入数字number=123456
    输入的数字是6位数
    逆序打印出的数字为654321

 30.回文数

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

程序分析:学会分解出每一位数。

#include <stdio.h>

void isPalindromeNumber(int n);

int main(){
	int n;
	printf("请输入一个数判断是否文回文数n=");
	scanf("%d",&n);
	
	isPalindromeNumber(n);
	
	return 0;
}

//设置一个回文数函数
//palindrome:回文
void isPalindromeNumber(int n){
	int number=n, newnumber=0;
	while(number>0){
		newnumber = newnumber*10 + number%10;
		number /= 10;
	}
	if(n==newnumber)
		printf("%d是回文数",n);
	else
		printf("%d不是回文数",n);	
}

结果:
    请输入一个数判断是否文回文数n=123456
    123456不是回文数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值