用C语言实现下述操作。有n个数(1<=n<=200000),第i个数为ai(1<=ai<=1000000000),求出这n个数中出现次数最多的数,并输出最多次数。
时间: 2024-05-09 22:15:05 浏览: 63
可以使用桶排序来实现该操作,先遍历一遍数组,将每个数出现的次数记录在桶中。然后再遍历一遍桶,找到出现次数最多的数以及其出现的次数。
以下是代码实现:
```c
#include <stdio.h>
int main()
{
int n, max_num = 0, max_count = 0;
scanf("%d", &n);
// 初始化桶
int bucket[1000000001] = {0};
// 遍历数组,统计每个数出现的次数
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
bucket[num]++;
}
// 遍历桶,找到出现次数最多的数
for (int i = 0; i < 1000000001; i++) {
if (bucket[i] > max_count) {
max_count = bucket[i];
max_num = i;
}
}
printf("%d %d", max_num, max_count);
return 0;
}
```
相关问题
用简单C语言实现给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗? 输入格式 第一行包含两个整数N和K。(1 <= N, K <= 100000) 以下N行每行包含一个整数Ai。(1 <= Ai <= 100000) 输出格式 输出一个整数,代表K倍区间的数目。
以下是简单C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000
int N, K;
int A[MAXN + 1];
int S[MAXN + 1];
int main() {
scanf("%d%d", &N, &K);
for (int i = 1; i <= N; i++) {
scanf("%d", &A[i]);
S[i] = (S[i - 1] + A[i]) % K;
}
int cnt[K];
for (int i = 0; i < K; i++) {
cnt[i] = 0;
}
cnt[0] = 1;
long long ans = 0;
for (int i = 1; i <= N; i++) {
ans += cnt[S[i]];
cnt[S[i]]++;
}
printf("%lld\n", ans);
return 0;
}
```
其中,我们使用cnt数组来记录余数出现的次数,并根据公式计算答案。在计算答案过程中,我们可以直接累加cnt[S[i]]的值,因为这个值表示可以与当前位置形成K倍区间的前缀数。最后,输出答案即可。
c语言输入整数m和n(100<= m<=n<=999),输出m~n之间的水仙花数的个数。所谓水仙花数,是指一个三位数,其各位数字立方和等于该数本身,例如153=1*1*1+3*3*3+5*5*5,则153是水仙花数。
以下是C语言代码实现:
```c
#include <stdio.h>
int main() {
int m, n, i, j, k, count = 0;
printf("请输入m和n(100<=m<=n<=999):");
scanf("%d%d", &m, &n);
for (i = m; i <= n; i++) {
j = i / 100; // 百位数
k = i % 100; // 十位数和个位数
if (i == j * j * j + (k / 10) * (k / 10) * (k / 10) + (k % 10) * (k % 10) * (k % 10)) {
count++;
printf("%d ", i);
}
}
printf("\n%d到%d之间的水仙花数的个数为:%d\n", m, n, count);
return 0;
}
```
程序先读取输入的m和n,然后使用for循环遍历m~n范围内的所有整数,对于每个整数,按照水仙花数的定义计算其百位数、十位数和个位数的立方和,如果等于该数本身,则说明该数是水仙花数,计数器加1。最后输出水仙花数的个数以及所有的水仙花数。
阅读全文