C语言刷题(编程题)系列——数组基础(1)

欢迎来到C语言刷题系列,在这里,我会一步一步详细的说出我对题目的看法,希望能够对你有所帮助,如果有错误或有更好的解法,可以在评论区留言,谢谢。(题目中不包含头文件,需要自己包含)

题目预览

题目1

在这里插入图片描述

题目2.

在这里插入图片描述

题目分析

题目1

在这里插入图片描述

我们可以将题目拆解成为两个部分,第一个是
在这里插入图片描述
对此我们需要看一下题目当中的输入格式,输入格式决定着我们怎么使用scanf函数
在这里插入图片描述
第一行输入一个整数n,所以代码如下
在这里插入图片描述
在这里,我们首先定义了一个变量n,然后利用scanf函数将输入的第一个数字存到变量n里面,这个n代表了我们接下来的数组的大小。

接下来,我们创建一个一维数组,其中n为数组的大小

在这里插入图片描述
其中,我们用到了变长数组。

变长数组是指数组的创建的大小,可以是一个变量。由于vs(Visual Studio 2022,简称vs)其中不支持变长数组,所以我们会发现这里报错了。

但是一般在刷题网站上都是支持变长数组的。但是也不一定非得一定用它。

在这道题目中,我们会发现n是有取值范围的,这就意味着,我们可以创建一个n的最大值的数组,这样的话就一定能存的下了。

这道题n最大值是100,所以我们可以直接创建一个100大小的数组
在这里插入图片描述
创建完成后,根据我们的输入格式可以看到,接下来我们要接受n个整数,并且要把他们存到数组中。

对于这种情况,我们就需要循环使用n次scanf函数。
在这里插入图片描述
首先我们写出for循环语句,i的取值为0 、1 、2 … n - 2到 n - 1 ,从0到n - 1 相当于是循环了n次,此时我们如果加上scanf函数,那么将会读取循环读取n 个数

并且为了将我们读取的n个数字依次存到数组里,我们需要利用每次循环当中的 i 作为我们的数组的下标。
在这里插入图片描述
注意:使用库函数需要包含对应的头文件

至此,我们的输入环节就已经到位了,接下来我们该处理我们的数据了。

在这里插入图片描述
这是我们刚才的题目的第二部分

题目要求我们求一个数组中值为奇数的平均值,既然是平均值,那么我们就需要 求和满足要求的元素个数

所以我们需要定义两个变量去计算这两个值。
在这里插入图片描述
其中sum用于数组中值为奇数的求和,count是个计数器,用于记录数组中奇数元素的个数。(重点,两个变量一定都要初始化为0

再由题目可知,我们求的是数组中值为奇数的元素的平均值。

所以我们需要实现下面两点,第一是遍历数组,第二需要判断数组中的元素是不是奇数。

首先我们先实现遍历数组。
在这里插入图片描述
其中,每次 arr[i] 便是数组中的下标为 i 的值。

接下来我们需要判断数组中的元素是不是奇数
在这里插入图片描述
如果是奇数,那么变量sum就要 加上该元素的值,并且我们的计数器也要+1.

在这里插入图片描述
经过遍历数组,此时sum表示所有奇数的和,count代表数组中奇数元素的个数,平均值就等于 和除以数量。

但是由于我们最初定义的 sum 和 count 都是 int 类型的,所以得到的结果也是int 类型的,所以我们需要将至少一个类型改成 double或者float ,也就是改成浮点型。
在这里插入图片描述
这里我选择将sum变成double类型的。

此时我们的结果已经得到了,接下我们需要利用printf函数来输出。

此时我们需要关注题目的输出格式
在这里插入图片描述
这里需要注意的点就是保留一位小数
在这里插入图片描述
%lf 在printf函数中用于打印double类型的值,我们只需要在 % 后面加上 一个点 再加上我们需要保留的小数点的个数即可。

参考答案

int main()
{
	int n;
	scanf("%d", &n);
	int arr[100];

	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}

	double sum = 0;
	int count = 0;
	for (int i = 0; i < n; i++)
	{
		if (arr[i] % 2 == 1)
		{
			sum += arr[i];
			count++;
		}
	}
	printf("%.1lf", sum / count);
	return 0;
}

本题知识点:

  1. 如何判断奇数
  2. 遍历数组
  3. 计数器的使用
  4. printf函数如何保留小数点
  5. 刷题当中数组的创建。

易错点:

  1. int类型除以int类型得到的一定是int类型的,不会得到小数,只要有一个浮点型,那么会得到小数。
  2. 定义的计数器和sum未初始化为0

题目2

在这里插入图片描述
首先完成题目的输入描述。
在这里插入图片描述
注意n 和 x的顺序。

从题目描述中我们可以知道,我们需要遍历1到n这些数字,我们也需要一个计数器来记录x出现的次数。
在这里插入图片描述
有了1到n 的数字,接下来我们需要知道 每个数字 当中 出现x 的次数怎么算。

为了更好的理解,我们先来举个例子。

假设计算 3523当中3出现的次数。

此时我们只需要确定每一位是不是3就可以了,那么就需要我们能够获取每一位上的数字

获取个位数,我们将原数 %10就可以得到个位数,3523 % 10 = 3。

获取十位数,我们将原数 / 10 % 10就可以得到十位数, 3523 / 10 % 10 = 2。

以此类推我们就可以获取 3523中的每一位(个、十、百、千)的数字,这样就可以和目标数字进行比对。

但是,在我们这次的题目中,数字的位数有很多可能,所以这就导致我们不能明确的知道 我需要写多少个位数 (比如5位数写5个,六位数写6个,然后跟x比较)

所以这时候我们就需要用到循环,方法思路如下:
比如还是我们的3523。

第一次循环,利用%10 获取3523的个位数,跟x比较,如果是x,那么计数器加1,然后将 3523 /= 10 (注意常量不能被赋值更改,这里我们假设 for循环中 i 是 3523)变成 352

第二次循环 ,利用%10 获取352的个位数,跟x比较,同样如果是x,那么计数器加1,然后将 352 /= 10 变成35.

在本次循环中,我们的循环的结束条件是 i != 0,在每次循环中的/= 10会使我们的数字越来越小,直到为零。

代码如下:

int main()
{
	int n, x;
	scanf("%d%d", &n, &x);

	int count = 0;
	for (int i = 1; i <= n; i++)
	{
		
	//----------------------
		//对i进行操作
		while (i != 0)
		{
			if (i % 10 == x)
			{
				count++;
			}
			i /= 10;
		}
	//---------------------
	}
	return 0;
}

但是这代码会出现一个问题,就是每次拿到 i 之后,最后会把 i 变成 0,从而导致循环发生错误。

所以就需要一个临时变量 来存储 i 。

更改代码如下:

int main()
{
	int n, x;
	scanf("%d%d", &n, &x);

	int count = 0;
	for (int i = 1; i <= n; i++)
	{
		int tem = i;
		while (tem != 0)
		{
			if (tem % 10 == x)
			{
				count++;
			}
			tem /= 10;
		}
	}
	return 0;
}

至此,count便是 1 到 n 中的 x的出现次数,最后我们只需要输出就好了。

参考答案


int main()
{
	int n, x;
	scanf("%d%d", &n, &x);

	int count = 0;
	for (int i = 1; i <= n; i++)
	{
		int tem = i;
		while (tem != 0)
		{
			if (tem % 10 == x)
			{
				count++;
			}
			tem /= 10;
		}
	}
	printf("%d", count);
	return 0;
}

本题知识点

  1. 计数器的使用
  2. 临时变量的思想
  3. 取余数获取个位数的思想
  4. while循环的使用

易错点:

  1. 需要创建临时变量
  2. 计数器一定要初始化为0

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值