C语言练习题第二弹!!!绝对典中典!!!

1. 喝汽水问题

1.1 题目

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给n元,可以喝多少汽水(编程实现)。

1.2 分析推理

1.  1元-->1瓶汽水

2.  2元-->3瓶汽水

3.  3元-->5瓶汽水

4.  4元-->7瓶汽水

5.  5元-->9瓶汽水

............

为了方便理解,我们以5元进行详细举例:

C语言练习题第二弹!!!绝对典中典!!!_第1张图片

 那么接下来,我们可以根据逻辑实现代码

1.3 代码实现

1.3.1 方法一

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
	//金额
	int money = 0;
	printf("请输入金额:");
	scanf("%d", &money);
	//初始化空瓶数
	int empty = money;//n元可以买n瓶,就有n个空瓶
	//初始化可买汽水总瓶数
	int sum = money;
	//计算空瓶能换到的汽水瓶数
	while (empty > 1)//2瓶换1瓶
	{
		sum += empty / 2;
		empty = empty % 2 + empty / 2;
	}
	printf("%d元可以买%d瓶汽水\n", money, sum);
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第2张图片

1.3.2 方法二

我们多试几次会发现:

5-->9   2*5-1

6-->11  2*6-1

7-->13  2*7-1

所以,我们可以得到规律:n个空瓶可以换到(2*n-1)瓶汽水

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
	//金额
	int money = 0;
	printf("请输入金额:");
	scanf("%d", &money);
	//初始化空瓶数
	int empty = money;//n元可以买n瓶,就有n个空瓶
	//初始化可买汽水总瓶数
	int sum = money;
	//计算空瓶能换到的汽水瓶数
	sum = empty * 2 - 1;
	printf("%d元可以买%d瓶汽水\n", money, sum);
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第3张图片

2. 打印棱形

2.1 题目

用C语言在屏幕上输出以下图案:

C语言练习题第二弹!!!绝对典中典!!!_第4张图片

2.2 分析推理

我们很容易发现*是在13*13的矩形里面的,以最中间一行为对称轴,上下6行轴对称;

以最中间一列为对称轴,左右列轴对称。

C语言练习题第二弹!!!绝对典中典!!!_第5张图片

 从轴对称的角度出发,我们先找到每一行的对称轴,区分上下部分,然后左右打印相等个数的*,其余地方空格

2.3 代码实现

2.3.1 方法一

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
	int arr[13][13] = {};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left, right;
	int mid = sz / 2;
	for (int i = 0; i < sz; i++)
	{
		//判断上下部分
		//确定左右界限
		if ((i > mid) && (i < sz))
		{
			int z = sz - 1 - i;
			left = mid - z;
			right = mid + z;
		}
		else
		{
			left = mid - i;
			right = mid + i;
		}
		for (int j = 0; j < sz; j++)
		{
			//打印中间的*
			if ((j <= right) && (j >= left))
			{
				printf("*");
			}
			else
			{
				printf(" ");
			}
		}
		printf("\n");
	}
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第6张图片

2.3.2 方法二

我们也可以从空格和*个数规律切入:

C语言练习题第二弹!!!绝对典中典!!!_第7张图片

 

C语言练习题第二弹!!!绝对典中典!!!_第8张图片

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
	//打印上半部分
	int line = 0;
	scanf("%d", &line);
	for (int i = 0; i < line; i++)
	{
		//空格数
		for (int j = 0; j < line - 1 - i; j++)
		{
			printf(" ");
		}
		//*个数
		for (int j = 0; j < 2 * i + 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	//打印下半部分
	for (int i = 0; i < line - 1; i++)
	{
		//空格数
		for (int j = 0; j < i+1 ; j++)
		{
			printf(" ");
		}
		//*个数
		for (int j = 0; j < 2 * (line - 1 - i)-1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第9张图片

3. 求1~100000所有的水仙花数

3.1 题目

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

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

3.2 分析推理

想要得到相应的水仙花数,我们需要知道它是几位数,然后得到每位对应的数字,再根据位数确定求和次方并求和,最后再判断是不是水仙花数

求次方,我们需要一个库函数:pow( )

3.3 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	for (int i = 0; i < 1000000; i++)
	{
		int count = 1;//一位数也有水仙花数
		int tmp = i;//利用tmp获得i的位数和求和
		int sum = 0;
		//判断位数
		while (tmp > 10)
		{
			count++;
			tmp = tmp / 10;
		}
		tmp = i;//确保tmp代表i
		//次方求和
		while (tmp)
		{
			sum += pow(tmp % 10, count);
			tmp = tmp / 10;
		}
		//判断是否是水仙花数
		if (sum == i)
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第10张图片

4. 猜凶手

4.1 题目

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

以下为4个嫌疑犯的供词:

A说:不是我。

B说:是C。

C说:是D。

D说:C在胡说

已知3个人说了真话,1个人说的是假话。

现在请根据这些信息,写一个程序来确定到底谁是凶手。

4.2 分析推理

很明显,根据题目意思,C和D肯定有一个人撒谎

1.C假D真

凶手是C

2.D假C真

B和C矛盾,不成立

所以,我们需要根据题目意思分为真假2种,真为1,假为0;真假相加为3则找出凶手

4.3 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
	char A, B, C, D;
	char killer = 0;
	for (killer = 'A'; killer<= 'D';killer ++)
	{
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
		{
			printf("凶手是%c\n", killer);
		}
	}
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第11张图片

 5. 杨氏矩阵

5.1 题目

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);

5.2 分析推理

C语言练习题第二弹!!!绝对典中典!!!_第12张图片

我们仔细分析,对于杨氏矩阵来说,右上角和左下角的元素是有特点的。右上角的元素是一行中最大的,一列中最小的。左下角的元素是一行中最小的,是一列中最大的。所以我们可以从右上角或者左下角开始查找

比如:从右上角开始查找的时候,右上角的元素比我们要查找元素小,我们就可以去掉右上角元素所在的这一行;右上角的元素比我们要查找的元素大,我们就可以去掉右上角元素所在的这一列。然后依然找右上角的元素继续和要查找的元素与比较。这样每一次比较去掉一行或者去掉一列。这个查找效率是高于遍历数组元素的,所以时间复杂度是小于O(N),也满足题目要求。

5.3 代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
int findnum(int arr[3][3], int x, int y, int key)
{
	//从右上角开始遍历
	int i = 0;
	int j = y - 1;
	while (j >= 0 && j < x)
	{
		if (arr[i][j] > key)
		{
			j--;
		}
		if (arr[i][j] < key)
		{
			i++;
		}
		else
		{
			return 1;
		}
	}
}
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,11} };
	if (findnum(arr, 3, 3, 11))
	{
		printf("It has been found!\n");
	}
	else
	{
		printf("It hasn't been found!\n");
	}
	return 0;
}

C语言练习题第二弹!!!绝对典中典!!!_第13张图片

 

PS:小江目前只是个新手小白。欢迎大家在评论区讨论哦!有问题也可以讨论的!

如果对你有帮助的话,记得点赞+收藏⭐️+关注➕​​​​​​​

C语言练习题第二弹!!!绝对典中典!!!_第14张图片

你可能感兴趣的:(练习题,c语言,开发语言)