😁博客主页😁:🚀从0至1-CSDN博客🚀
🤑博客内容🤑:🍭C语言、C++、数据结构、嵌入式、Linux🍭
😎本文内容🤣:🍭BC126 小乐乐查找数字🍭
😎金句分享😎:🍭NO🍭
目录
目录
描述
输入描述:
输出描述:
示例
解题思路
理解输入和输出
设计算法
代码
更多代码
课后拓展
拓展1: 支持更大的数组
解题思路
拓展2: 统计多个目标数字
解题思路
实现代码
拓展3: 处理负数
解题思路
实现代码
拓展4: 使用哈希表
解题思路
实现代码
拓展5: 图形化展示
解题思路
实现代码
描述
给定n个整数和一个整数x,小乐乐想从n个整数中判断x出现几次,请编程帮他实现。
输入描述:
共3行
第一行,一个整数,表示n(1 <= n <= 100)。
第二行,共输入n个整数,两个整数之间用空格分隔。
第三行,输入一个整数,表示要查找的整数x。
输出描述:
一行,表示整数x出现的次数。
示例
解题思路
理解输入和输出
- 输入:
- 数组长度
a
。 - 数组元素(共
a
个)。 - 目标数字
b
。
- 数组长度
- 输出:
- 目标数字
b
在数组中出现的次数。
- 目标数字
设计算法
- 读取数组长度:
- 使用
scanf
函数读取用户输入的数组长度a
。
- 使用
- 读取数组元素:
- 使用一个
for
循环从用户那里读取a
个整数,并将它们存储在数组arr
中。
- 使用一个
- 读取目标数字:
- 使用
scanf
函数读取用户输入的目标数字b
。
- 使用
- 统计目标数字出现的次数:
- 初始化计数器
count
为0
。 - 使用另一个
for
循环遍历数组arr
,如果当前元素等于目标数字b
,则增加count
的值。
- 初始化计数器
- 输出结果:
- 使用
printf
函数输出目标数字b
在数组中出现的次数。
- 使用
代码
#include <stdio.h>
int main()
{
int a;
int b = 0;
int i;
int count = 0; // 初始化 count 为 0
int arr[100] = {0};
scanf("%d", &a); // 输入数组长度
for(i = 0; i < a; i++)
{
scanf("%d", &arr[i]); // 输入数组元素
}
scanf("%d", &b); // 输入要查找的目标数字
for(i = 0; i < a; i++)
{
if(arr[i] == b)
{
count++; // 统计目标数字出现的次数
}
}
printf("%d\n", count); // 输出目标数字出现的次数
return 0;
}
/*-----------------------------------------------------------------*/
/*以下是加注释后的*/
#include <stdio.h>
int main()
{
int a; // 声明变量 a 用于存储数组长度
int b = 0; // 声明变量 b 用于存储要查找的目标数字,初始值为 0
int i; // 声明变量 i 作为循环控制变量
int count = 0; // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
int arr[100] = {0}; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
}
scanf("%d", &b); // 输入要查找的目标数字并存储在变量 b 中
for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
{
if(arr[i] == b) // 如果当前元素等于目标数字 b
{
count++; // 增加 count 的值,统计目标数字出现的次数
}
}
printf("%d\n", count); // 输出目标数字在数组中出现的次数
return 0; // 返回 0 表示程序成功结束
}
-
变量声明:
int a; int b = 0; int i; int count = 0; // 初始化 count 为 0 int arr[100] = {0};
a
: 存储数组的长度。b
: 存储要查找的目标数字。i
: 循环控制变量。count
: 用于统计目标数字出现的次数,初始值为0
。arr[100]
: 存储输入的数组元素,最大支持100个元素。
-
读取数组长度:
scanf("%d", &a);
- 用户输入数组的长度并存储在变量
a
中。
- 用户输入数组的长度并存储在变量
-
读取数组元素:
for(i = 0; i < a; i++) { scanf("%d", &arr[i]); }
- 使用
for
循环读取用户输入的数组元素,并存储在数组arr
中。
- 使用
-
读取目标数字:
scanf("%d", &b);
- 用户输入要查找的目标数字并存储在变量
b
中。
- 用户输入要查找的目标数字并存储在变量
-
统计目标数字出现的次数:
for(i = 0; i < a; i++) { if(arr[i] == b) { count++; } }
- 使用
for
循环遍历数组,如果当前元素等于目标数字b
,则增加count
的值。
- 使用
-
输出结果:
printf("%d\n", count);
- 输出目标数字在数组中出现的次数。
更多代码
#include<stdio.h>
int main(){//桶排
int arr[100]={0};//100个桶初始化为0
int n=0;
int temp=0;//桶的编号
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&temp);//获得桶编号
arr[temp]++;//temp对应数的桶里,出现就自增,即为出现次数
}
int index=0;
scanf("%d",&index);
printf("%d",arr[index]);
return 0;
}
#include <stdio.h>
int main()
{
int n = 0; // 存储数组长度
int input = 0; // 存储当前输入的数组元素
int x = 0; // 存储要查找的目标数字
int count[1000] = {0}; // 用于统计每个数字出现的次数,最多支持1000个不同的数字
scanf("%d", &n); // 输入数组长度
// 使用 while 循环读取数组元素,并统计每个数字出现的次数
while (n--) {
scanf("%d", &input); // 读取当前数组元素
count[input]++; // 增加对应数字的计数
}
scanf("%d", &x); // 输入要查找的目标数字
printf("%d\n", count[x]); // 输出目标数字在数组中出现的次数
return 0;
}
-
变量声明:
int n = 0; // 存储数组长度 int input = 0; // 存储当前输入的数组元素 int x = 0; // 存储要查找的目标数字 int count[1000] = {0}; // 用于统计每个数字出现的次数,最多支持1000个不同的数字
-
读取数组长度:
scanf("%d", &n); // 输入数组长度
-
读取数组元素并统计次数:
while (n--) { scanf("%d", &input); // 读取当前数组元素 count[input]++; // 增加对应数字的计数 }
- 使用
while
循环读取数组元素,并将每个数字的出现次数存储在count
数组中。
- 使用
-
读取目标数字:
scanf("%d", &x); // 输入要查找的目标数字
-
输出结果:
printf("%d\n", count[x]); // 输出目标数字在数组中出现的次数
- 输出目标数字
x
在数组中出现的次数。
- 输出目标数字
课后拓展
拓展1: 支持更大的数组
当前代码支持的最大数组长度为100。如果我们需要处理更大的数组,可以通过动态内存分配来实现。
解题思路
-
动态内存分配:
- 使用
malloc
函数动态分配内存以存储数组元素。 - 检查内存分配是否成功,如果失败则输出错误信息并退出程序。
- 使用
-
读取数组元素:
- 使用
for
循环从用户那里读取数组元素,并存储在动态分配的数组中。
- 使用
-
统计目标数字出现的次数:
- 初始化计数器
count
为0
。 - 使用
for
循环遍历数组,如果当前元素等于目标数字b
,则增加count
的值。
- 初始化计数器
-
输出结果:
- 使用
printf
函数输出目标数字b
在数组中出现的次数。
- 使用
-
释放内存:
- 使用
free
函数释放动态分配的内存,避免内存泄漏。
- 使用
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a; // 声明变量 a 用于存储数组长度
int b = 0; // 声明变量 b 用于存储要查找的目标数字,初始值为 0
int i;
int count = 0; // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
int *arr; // 声明指针 arr 用于动态分配数组
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
// 动态分配内存
arr = (int *)malloc(a * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed\n"); // 内存分配失败时输出错误信息
return 1; // 返回 1 表示程序异常结束
}
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
}
scanf("%d", &b); // 输入要查找的目标数字并存储在变量 b 中
for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
{
if(arr[i] == b) // 如果当前元素等于目标数字 b
{
count++; // 增加 count 的值,统计目标数字出现的次数
}
}
printf("%d\n", count); // 输出目标数字在数组中出现的次数
// 释放动态分配的内存
free(arr);
return 0; // 返回 0 表示程序成功结束
}
拓展2: 统计多个目标数字
如果需要统计多个目标数字的出现次数,可以使用一个循环来多次读取目标数字并输出结果。
解题思路
-
读取数组长度和数组元素:
- 使用
scanf
函数读取数组长度a
。 - 使用
for
循环从用户那里读取数组元素,并存储在数组arr
中。
- 使用
-
读取目标数字的数量:
- 使用
scanf
函数读取要查找的目标数字的数量num_targets
。
- 使用
-
统计每个目标数字的出现次数:
- 使用嵌套的
for
循环:- 外层循环遍历每个目标数字。
- 内层循环遍历数组,统计目标数字出现的次数。
- 使用
count
数组来存储每个目标数字的出现次数。
- 使用嵌套的
-
输出结果:
- 对于每个目标数字,输出其在数组中出现的次数。
实现代码
#include <stdio.h>
int main()
{
int a; // 声明变量 a 用于存储数组长度
int num_targets; // 声明变量 num_targets 用于存储要查找的目标数字的数量
int i, j;
int count[1000] = {0}; // 声明数组 count 用于统计每个数字出现的次数,最多支持1000个不同的数字
int arr[100]; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
int targets[100]; // 声明数组 targets 用于存储要查找的目标数字
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
}
scanf("%d", &num_targets); // 输入要查找的目标数字的数量
for(j = 0; j < num_targets; j++) // 使用 for 循环读取每个目标数字
{
scanf("%d", &targets[j]); // 输入当前目标数字并存储在 targets[j] 中
for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
{
if(arr[i] == targets[j]) // 如果当前元素等于目标数字 targets[j]
{
count[targets[j]]++; // 增加对应目标数字的计数
}
}
printf("%d\n", count[targets[j]]); // 输出目标数字在数组中出现的次数
}
return 0; // 返回 0 表示程序成功结束
}
拓展3: 处理负数
当前代码假设数组中的所有元素都是非负整数。如果需要处理负数,可以调整数组 count
的大小和索引方式。
解题思路
-
调整数组大小:
- 使用更大的数组
count
来支持负数。 - 定义一个偏移量
OFFSET
,使得负数也能映射到数组的有效索引范围内。
- 使用更大的数组
-
读取数组长度和数组元素:
- 使用
scanf
函数读取数组长度a
。 - 使用
for
循环从用户那里读取数组元素,并存储在数组arr
中。
- 使用
-
统计目标数字的出现次数:
- 初始化计数器
count
为0
。 - 使用
for
循环遍历数组,如果当前元素等于目标数字b
,则增加count[b + OFFSET]
的值。
- 初始化计数器
-
输出结果:
- 使用
printf
函数输出目标数字b
在数组中出现的次数。
- 使用
实现代码
#include <stdio.h>
#define MAX_NUM 1000
#define OFFSET 500
int main()
{
int a; // 声明变量 a 用于存储数组长度
int b = 0; // 声明变量 b 用于存储要查找的目标数字,初始值为 0
int i;
int count[2 * MAX_NUM + 1] = {0}; // 声明数组 count 用于统计每个数字出现的次数,支持 -MAX_NUM 到 MAX_NUM
int arr[100]; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
}
scanf("%d", &b); // 输入要查找的目标数字并存储在变量 b 中
for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
{
if(arr[i] == b) // 如果当前元素等于目标数字 b
{
count[b + OFFSET]++; // 增加对应目标数字的计数
}
}
printf("%d\n", count[b + OFFSET]); // 输出目标数字在数组中出现的次数
return 0; // 返回 0 表示程序成功结束
}
拓展4: 使用哈希表
对于更大范围的数字或更高效的统计,可以使用哈希表(散列表)来存储和统计数字的出现次数。
解题思路
-
定义哈希表结构体:
- 定义一个
HashNode
结构体,包含键、值和指向下一个节点的指针。 - 定义一个大小固定的哈希表数组
hashTable
。
- 定义一个
-
哈希函数:
- 定义一个简单的哈希函数
hashFunction
,将键映射到哈希表的索引位置。
- 定义一个简单的哈希函数
-
插入和更新操作:
- 定义
insert
函数,在哈希表中插入一个新的键值对。 - 定义
increment
函数,增加指定键的值。
- 定义
-
查询操作:
- 定义
getCount
函数,获取指定键的值。
- 定义
-
释放内存:
- 定义
freeHashTable
函数,释放哈希表占用的内存。
- 定义
-
读取数组长度和数组元素:
- 使用
scanf
函数读取数组长度a
。 - 使用
for
循环从用户那里读取数组元素,并调用increment
函数更新哈希表。
- 使用
-
读取目标数字:
- 使用
scanf
函数读取要查找的目标数字b
。
- 使用
-
输出结果:
- 使用
getCount
函数获取目标数字b
在数组中出现的次数,并使用printf
函数输出结果。
- 使用
-
释放哈希表内存:
- 调用
freeHashTable
函数释放哈希表占用的内存。
- 调用
实现代码
#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 1000
typedef struct HashNode {
int key;
int value;
struct HashNode* next;
} HashNode;
HashNode* hashTable[HASH_SIZE];
unsigned int hashFunction(int key) {
return abs(key) % HASH_SIZE; // 计算哈希值
}
void insert(HashNode** table, int key) {
unsigned int index = hashFunction(key);
HashNode* newNode = (HashNode*)malloc(sizeof(HashNode));
newNode->key = key;
newNode->value = 1;
newNode->next = table[index];
table[index] = newNode;
}
void increment(HashNode** table, int key) {
unsigned int index = hashFunction(key);
HashNode* current = table[index];
while (current != NULL) {
if (current->key == key) {
current->value++;
return;
}
current = current->next;
}
insert(table, key);
}
int getCount(HashNode** table, int key) {
unsigned int index = hashFunction(key);
HashNode* current = table[index];
while (current != NULL) {
if (current->key == key) {
return current->value;
}
current = current->next;
}
return 0;
}
void freeHashTable(HashNode** table) {
for (int i = 0; i < HASH_SIZE; i++) {
HashNode* current = table[i];
while (current != NULL) {
HashNode* temp = current;
current = current->next;
free(temp);
}
}
}
int main()
{
int a; // 声明变量 a 用于存储数组长度
int b = 0; // 声明变量 b 用于存储要查找的目标数字,初始值为 0
int i;
int arr[100]; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
increment(hashTable, arr[i]); // 增加对应数字的计数
}
scanf("%d", &b); // 输入要查找的目标数字并存储在变量 b 中
printf("%d\n", getCount(hashTable, b)); // 输出目标数字在数组中出现的次数
freeHashTable(hashTable); // 释放哈希表占用的内存
return 0; // 返回 0 表示程序成功结束
}
拓展5: 图形化展示
如果希望以图形化的方式展示结果,可以使用简单的字符图形或调用图形库(如SDL、OpenGL等)。这里我们使用简单的字符图形来展示。
解题思路
-
读取数组长度和数组元素:
- 使用
scanf
函数读取数组长度a
。 - 使用
for
循环从用户那里读取数组元素,并存储在数组arr
中。
- 使用
-
读取目标数字:
- 使用
scanf
函数读取要查找的目标数字b
。
- 使用
-
统计目标数字的出现次数:
- 初始化计数器
count
为0
。 - 使用
for
循环遍历数组,如果当前元素等于目标数字b
,则增加count
的值。
- 初始化计数器
-
输出结果:
- 使用
printf
函数输出目标数字b
在数组中出现的次数。
- 使用
-
简单字符图形展示:
- 使用
for
循环打印星号*
来表示目标数字出现的次数。
- 使用
实现代码
#include <stdio.h>
int main()
{
int a; // 声明变量 a 用于存储数组长度
int b = 0; // 声明变量 b 用于存储要查找的目标数字,初始值为 0
int i;
int count = 0; // 声明变量 count 用于统计目标数字出现的次数,初始值为 0
int arr[100]; // 声明数组 arr 用于存储输入的数组元素,最大支持 100 个元素
scanf("%d", &a); // 输入数组长度并存储在变量 a 中
for(i = 0; i < a; i++) // 使用 for 循环读取数组元素
{
scanf("%d", &arr[i]); // 输入当前数组元素并存储在 arr[i] 中
}
scanf("%d", &b); // 输入要查找的目标数字并存储在变量 b 中
for(i = 0; i < a; i++) // 使用 for 循环遍历数组元素
{
if(arr[i] == b) // 如果当前元素等于目标数字 b
{
count++; // 增加 count 的值,统计目标数字出现的次数
}
}
printf("Number of occurrences of %d: %d\n", b, count); // 输出目标数字在数组中出现的次数
// 简单字符图形展示
printf("Occurrences:\n");
for(i = 0; i < count; i++)
{
printf("*"); // 打印星号表示一次出现
}
printf("\n");
return 0; // 返回 0 表示程序成功结束
}