C语言刷题(一)-创新互联

🐒博客名:平凡的小苏

站在用户的角度思考问题,与客户深入沟通,找到翼城网站设计与翼城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、成都做网站、企业官网、英文网站、手机端网站、网站推广、域名注册、虚拟空间、企业邮箱。业务覆盖翼城地区。

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

目录

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

猴子吃桃问题

奇偶数换位问题

水仙花数(0-100000)

换啤酒问题


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

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

代码演示:

#includeint 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)

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

非递归逆推法:

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

代码演示:

#includeint 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);
}

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

#includeint 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;
}

奇偶数换位问题

题目:

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

不考虑相对顺序 

//不考虑相对顺序
#includevoid 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


.

考虑先对顺序

代码演示:

#includevoid 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#includeint 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瓶子

#includeint 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;
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:C语言刷题(一)-创新互联
文章链接:http://abwzjs.com/article/ghoed.html