欢迎来到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;
}
本题知识点:
- 如何判断奇数
- 遍历数组
- 计数器的使用
- printf函数如何保留小数点
- 刷题当中数组的创建。
易错点:
- int类型除以int类型得到的一定是int类型的,不会得到小数,只要有一个浮点型,那么会得到小数。
- 定义的计数器和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;
}
本题知识点
- 计数器的使用
- 临时变量的思想
- 取余数获取个位数的思想
- while循环的使用
易错点:
- 需要创建临时变量
- 计数器一定要初始化为0
完