下面是一个初级软考编程题: 已知一个整数数组,数组中的数可以重复,设计一个程序,找出其中所有的“幸运数”,所谓“幸运数”是指,在这个数组中出现频率大于等于2次的数。 例如,对于数组 [1, 2, 2, 3, 3, 3, 4, 4, 4, 4],其中的“幸运数”为2、3和4。 请编写程序实现上述功能。*/ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ int n; printf("请输入数组长度:"); scanf("%d",&n); int b[100] = {0}; int *a = (int*)malloc(n * sizeof(int)); int c=0; for(int e=0; e<n; e++){ a[e] = rand() % 10; } for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ int flag = 1; if(a[i] == a[j]){ flag++; } } } free(a); *a=NULL; return 0; }
时间: 2024-01-09 16:05:57 浏览: 68
这段代码存在一些问题,比如:
1. 变量 `c` 没有用到,不需要声明。
2. 在第一个循环里通过 `rand() % 10` 随机生成数组元素,这样得到的数组可能不会出现“幸运数”。
3. 在第二个循环里,变量 `flag` 每次都会被赋值为 `1`,无法正确计数。
4. 循环嵌套的写法不够简洁,可以使用哈希表等数据结构来优化。
下面是一个改进后的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
int main() {
int n, a[MAX_N];
printf("请输入数组长度:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个元素:", i + 1);
scanf("%d", &a[i]);
}
int count[MAX_N] = {0};
for (int i = 0; i < n; i++) {
count[a[i]]++;
}
int lucky_count = 0;
printf("幸运数为:");
for (int i = 0; i < MAX_N; i++) {
if (count[i] >= 2) {
printf("%d ", i);
lucky_count++;
}
}
if (lucky_count == 0) {
printf("无");
}
printf("\n");
return 0;
}
```
这个程序使用了一个计数数组 `count`,它的下标表示数组元素的取值范围,值表示该元素出现的次数。在第一个循环中,遍历一遍数组,统计每个元素出现的次数。在第二个循环中,遍历一遍计数数组,输出所有出现次数大于等于 2 的元素。
阅读全文