C语言刷题(一)

博客名:平凡的小苏

学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情

C语言刷题(一)_第1张图片 

目录

 用递归法求一个整数一维数组a的最大元素

猴子吃桃问题

奇偶数换位问题

水仙花数(0-100000)

换啤酒问题


 用递归法求一个整数一维数组a的最大元素

主要思想:利用sizeof计算出数组的元素,因为数组下标从1开始,需要将算出来的元素个数减1.因为传入十个元素递归方法不能直接比较,所以需要先转化为两个元素来比较,一直递归到第一个元素的下标,返回给k,然后k和f(arr[1])比较,哪个大就返回哪个,以此类推

代码演示:

#include
int Array(int arr[], int sz)
{
	int k = 0;
	if (sz > 0)
	{
		k = Array(arr, sz - 1);//将它从大问题化为小问题,递归到只有两个数进行比较
		if (k > arr[sz])
		{
			return k;
		}
		else
			return arr[sz];
	}
	else
	{
		return arr[0];
	}
}
int main()
{
	int arr[] = { 9,2,4,5,0,1,6,7,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = Array(arr, sz - 1);//下标从0开始,所以减1
	printf("%d", ret);
	return 0;
}

猴子吃桃问题


猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾, 于是又多吃了一个第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个等到第N天的时候发现桃子只有1个了。

(1<=N<=10)

需求:请问猴子第一天摘了多少个桃子 ?(递归和非递归求解)

非递归逆推法:

主要思想:依题意知,每次吃一半的桃子加一个,到最后一天会剩余一个桃子。那么我们把第十天来当成第一天,从小推大的方法就是,首先第十天剩余一个,那么第九天就是乘以两倍加一个桃子再加剩余没吃的桃子,得到第八天桃子数量,然后第八天乘以两倍加一个桃子,在加剩余一个没吃的得到第七天的桃子数量。以此类推得到第一天摘了多少个桃子。

 C语言刷题(一)_第2张图片

 

代码演示:

#include 
int main()
{
	int day = 0;
	scanf("%d", &day);
    int i, n = 1;	//n初始化为第1天的桃子数量
    for (i = day; i > 1; i--)	//依次计算第9天到第1天的数量
        n = (n + 1) * 2;
    printf("猴子第一天共摘了 %d 个桃子。", n);
}

递归方法:与逆推法思想是一样的


#include
int Monkey(int day)
{
	if (day > 1)
	{
		return 2 * Monkey(day - 1) + 2;
	}
	else
	{
		return 1;
	}
}
int main()
{
	int day = 0;
	scanf("%d", &day);
	int ret = Monkey(day);
	printf("%d\n", ret);
	return 0;
}

 

奇偶数换位问题

题目:

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

不考虑相对顺序 

//不考虑相对顺序
#include
void odd_even_swap(int* arr, int sz)
{
	int* left = arr;
	int* right = arr + sz - 1;
	while (left < right)
	{
		while (*left % 2 == 1 && left < right)//判断条件如果左边一半找到偶数就停下来,为了防止数组都是奇数所以需要left

C语言刷题(一)_第3张图片
.

 考虑先对顺序

代码演示:

#include
void odd_even_swap(int* arr, int sz)
{
	int j = 0;
	int k = 0;
	int i = 0;

	for (j = 0; j < sz; j++)//遍历整个一维数组
	{
		if (arr[j] % 2 == 1)//判断是否为奇数
		{
			int temp = arr[j];//用temp存一下这个奇数,当偶数都后移一个位置后,将奇数赋值过去
			for (k = j - 1; k >= i; k--)
			{

				arr[k + 1] = arr[k];//将i和a之间的偶数都向后移动一个位置。这里用a-1,是为了防止a=0时进入循环,其实a=0;就不用交换了..还有就是为了防止交换时没有越界交换
			}
			arr[i] = temp;
			i++;
		}
	}
}
int main()
{
	int arr[] = { 2,1,9,0,3,4,8,7,5,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	odd_even_swap(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

水仙花数(0-100000)

求出0~100000之间的所有“水仙花数”并输出。

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”

代码演示:

#include
#include
int main()
{
	int i = 0;
	for (i = 0; i < 100000; i++)
	{
		int sum = 0;
		int count = 1;//计算数的位数
		int temp = i;
		while (temp/=10)
		{
			count++;
		}
		temp = i;
		while (temp)
		{
			sum += pow(temp % 10, count);//利用库函数求一个数的n位数的次方.使用pow库函数需要包含#include的头文件
			temp /= 10;
		}
		if (sum == i)
		{
			printf("%d ", i);
		}
	}
	
	return 0;
}

 

换啤酒问题


需求:啤酒2元1瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶
请问n元钱可以喝多少瓶酒,剩余多少空瓶和盖子
答案 : 10元15瓶3盖子1瓶子

#include
int main()
{
	int lid = 0;//盖子
	int money = 0;//钱
	int empty = 0;//空瓶
	int beer = 0;//啤酒
	int num = 0;
	scanf("%d", &money);
	beer = money / 2;
	lid = money / 2;
	empty = money / 2;
	while (empty>=2)//先换啤酒瓶,小于2个空瓶换不了啤酒
	{
		 num = empty / 2;//五个啤酒瓶换2个啤酒,并且就会得到两个空瓶和两个盖子
		empty = (empty % 2) + num;//如果啤酒瓶为单数,会剩下一瓶没换,所以需要取模于2
		lid += num;//换的啤酒瓶也会得到盖子
		beer += num;//更新啤酒的总数
		while (lid >= 4)//小于四个盖子换不了啤酒
		{
			num = lid / 4;//四个盖子换一瓶啤酒
			lid = (lid % 4) + num;//换的啤酒会得到盖子,并且需要加上小于4没有换的盖子
			empty = empty + num;//换完啤酒后需要更新啤酒的数量,因为换完啤酒后又有空瓶了
			beer += num;//更新啤酒的总数
		}
	} 
	printf("可以买到%d瓶啤酒\n", beer);
	printf("剩余%d个盖子\n", lid);
	printf("剩余%d个空瓶\n", empty);
	return 0;
}

 C语言刷题(一)_第4张图片

 

你可能感兴趣的:(c语言,算法,数据结构)