问题描述:输入一组无序的整数,编程输出其中出现次数最多的整数及其出现次数。
首先定义三个数组a,b,c,其中:
a数组存放这组无序的整数;
b数组存放某个重复数字出现的次数;
c数组存放该重复数字在a数组中的序号;
int a[100],b[100],c[100];
int n,i,j,t,max;
然后将这组数排序n次,使其变成从小到大排序的数列(重复数字会相邻排列)
for(i=1;i<n;i++)
{
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
j=0; //重置j
t=-1; //重置t
}
遍历排序后的数组a,记录重复数字出现的次数及其在数组a中的序号
for(i=0;i<n-1;i++)
{
if(a[i]!=a[i+1])
{
b[j]=i-t;
c[j]=i;
t=i;
j++;
}
b[j]=n-1-t;
c[j]=n-1;
}
比较数组b中的数,得出最大的数,即重复最多的次数
for(i=1;i<=j;i++)
{
if(max<b[i])
{
max=b[i];
}
}
测试1:
测试2:
完整代码:
#include <stdio.h>
int main(){
int a[100],b[100],c[100]; //a记录数字序列;b记录某个数字重复出现的次数;c记录这个数字的序号
int n,i,j,t,max;
scanf("%d",&n); //输入整数个数
for(i=0;i<n;i++)
{
scanf("%d",&a[i]); //依次输入整数,存放在a数组
}
for(i=1;i<n;i++) //将这组数排序n次,变成从小到大排序的数列
{
for(j=0;j<n-1;j++)
{
if(a[j]>a[j+1]) //如果左边的数大于右边的数 ,交换它们的位置
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
j=0; //重置j
t=-1; //重置t
}
for(i=0;i<n-1;i++) //遍历排序后的数组a
{
if(a[i]!=a[i+1]) //记录同样的数字出现的次数(当左边的数不等于右边时,表示左边的数字结束重复了)
{
b[j]=i-t; //数组b记录该数字重复的次数
c[j]=i; //数组c记录该数字在a数组中的序号
t=i;
j++;
}
b[j]=n-1-t;
c[j]=n-1;
max=b[0]; //设max初始为b[0],即第一个数字重复出现的次数
}
for(i=1;i<=j;i++)
{
if(max<b[i]) //比较b数组中最大的数,即重复次数最多的次数
{
max=b[i];
}
}
for(i=0;i<=j;i++)
{
if(b[i]==max)
{
t=c[i]; //c[i]表示该数字在a数组中的序号,赋值给t
printf("%d %d\n",a[t],b[i]); //输出整数及出现个数
}
}
return 0;
}