C语言程序设计18-27

1.猴子吃桃问题

猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 

分析:反向分析 前天桃子的数量=(当天桃子数量+1)*2

源代码: 

#include<stdio.h> 
int main(){
	int i,S;
	S=1;
	for(i=9;i>=1;i--){
		S=(S+1)*2;
	}
	printf("第一天摘了%d个桃子\n",S);
	return 0;
} 

【递归】 

#include<stdio.h>

int f(int n){
	int i=0;
	if(n==10){
		i=1;
	}
	else
	{
		i=(f(n+1)+1)*2;
	}
	return i;
}
int main(){
	printf("第一天摘了%d个桃子。\n",f(1));
	return 0;
}
2.乒乓球比赛抽签问题

两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

分析:

循环依次比较,两两比较,判断参赛队员是否重复,因此需要两个if 在循环中间判断

源代码: 

#include<stdio.h>
int main()
{
	int i,j,k;  //i是a的对手,j是b的对手,k是c的对手
		for (i = 'x';i <= 'z'; i++)
		{
			for (j = 'X';j <= 'z'; j++)
			{
				if (i != j)//避免重复比赛
				{
					for (k = 'x'; k <= 'z'; k++)
				    {
						if (i != k&&j!=k)//避免重复比赛
						{
							if (i != 'x' && k != 'x' && k != 'z')
							{
								printf(" a对%c\n b对%c\n c对%c", i, j, k);
							}
						}
					}
				}
			}	
		}	
	return 0;
}
3.打印菱形图案

打印出如下图案(菱形)

   

分析:

每行每行的进行循环输出

源代码: 

#include <stdio.h>

int main (void)
{
	int i, j, k;
	for (i = 1; i <= 4; i++) //先打印前4行
	{
		for (j = 1; j <= 5 - i; j++) //每一行先打印需要打印的空格,空格数为(5 - 行号),譬如第1行,需要打5-1个空格,第2行需要打5-2个空格
			printf(" ");
		for (k = 1; k <= 2 * i-1; k++) //打完空格打‘*',每行需要打印2倍行号-1个,譬如第1行打印2*1 - 1个,第2行打印2*2 - 1=3个
			printf("*");
		printf("\n");
	}
	for (i = 1; i <= 3; i++) //然后打印后面三行,行号从1开始计算
	{
		for (j = 1; j <= i+1; j++) //每行打印空格数为行号数,譬如第1行打印1+1个,第2行打印2+1个
			printf(" ");
		for (k = 1; k <= 7 - 2 * i; k++) //每行打印7-2*i个'*',譬如第1行打印7-2*1=5个,第2行打印7-2*2=3个
			printf("*");
		printf("\n");
	}
}
4.分数数列求和

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

分析:

for循环,s=s+a/b;

使用temp作为中间数据进行转换

源代码: 

#include<stdio.h>
int main(){
	int i;
	float temp,s=0,a=2,b=1;//注意分子分母以及和的形式 

	for(i=1;i<=20;i++){
		s=s+a/b;
		temp=a;
		a=a+b;
		b=temp;
	}
	printf("前二十项和为%9.6f\n",s);
	return 0;
} 
5.求1+2!+3!+...+20!的和

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

分析:

for循环

sn+1=sn+n*(n+1)

源代码: 

#include<stdio.h>
int 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);
	return 0;
}
6.利用递归方法求5!

 利用递归方法求5!。

分析:

f(n)=n*f(n-1)

源代码: 

#include <stdio.h>
int f(int n)
{
	if (n == 1)
	{
		return 1;
	}
	else
	{
		return  n * f(n - 1);
	}
}
int main()
{
	int f(int n);//调用函数
	int m = 5;
	printf("5!=%d\n", f(m));
	return 0;
}
7.将输入字符以相反顺序打印

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

分析:

字符用getchar输入,putchar输出(入栈出栈)

递归函数,反复调用

源代码: 

#include<stdio.h>

void f(int n){
	char c;
	if(n==1){
		c = getchar();//入栈
		putchar(c);//出栈
	}
	else
	{
		c = getchar();
		f(n-1);
		putchar(c);
	}
} 
int main(){
	void f(int n);
	f(5);
	return 0;
}
8.岁数问题

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

分析:

递归:一直加2

源代码: 

#include<stdio.h>

int age(int n){//递归函数 
	int a=0;
	if(n==1)
	a=10;
	else 
    a=age(n-1)+2;
    return a;//返回a的值 
}

int main(){
	printf("第五个人%d岁\n",age(5));
	return 0;
}

一般: 

#include <stdio.h>
int main()
{
	int i=1,sum=10; 
	for(i=1;i<5;i++)
	{
		sum+=2;
	 }
	 printf("第五个是%d岁",sum);
	return 0;
}
9.求解正整数问题

 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

分析:

运用除和商得各位上数字

源代码: 

#include<stdio.h>
int 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);
	return 0;
} 

 利用字符串,根据字符串的库函数求出位数,自定义函数,实现逆序。【进阶】

#include <stdio.h>
#include <string.h>
// 定义一个字符串数组,用来存放得到的整数
static char str[5];
//自定义函数,实现逆序
void Reverse(int n) {
	while (n > 0) {
		printf("%c", str[--n]);
	}
}
int main() {
	
	printf("请输入一个正整数:");
	scanf("%s", str);
	// 利用库函数求字符串长度,即为所求整数的位数
	printf("这是一个%lu位数\n", strlen(str));
	printf("逆序为:");
	// 调用自定义逆序函数
	Reverse(strlen(str));
	return 0;
}
10.判断回文数

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

分析:

与【9】类似

源代码: 

#include<stdio.h> 
int 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");
	return 0;
}

【字符串】 利用字符串,将这5位数作为字符串输入到一个字符数组中,利用数组下标找到各个数字进行比较,判断是否为回文数字

#include <stdio.h>
#include<string.h>

int main()
{
    char str[5];
    printf("请输入五位数:");
    scanf("%s", str);

    if (str[0] == str[4] && str[1] == str[3])
        printf("这是一个回文数。\n");
    else
        printf("这不是回文数。\n");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值