众数问题c语言
(1)"int
a[n],A[n]"定义有问题,定义一个数组,应该用常量制定数组的长度,而不是变量
(2)"A[a[i]]++";如果a[i]是一个很大很大的数,就会超出数组的范围,出现错误
‘贰’ C语言求众数的问题
众数定义:
众数(Mode)统计学名词,将数据按从大到小顺序排列后,在统计分布上具有明显集中趋势点的数值,代表数据的一般水平(众数可以不存在或多于一个)。
修正定义:是一组数据中出现频数最多的那个数值,用M。表示。
理性理解:简单的说,就是一组数据中占比例最多的那个数。
用众数代表一组数据,可靠性较差,不过,众数不受极端数据的影响,并且求法简便。在一组数据中,如果个别数据有很大的变动,选择中位数表示这组数据的“集中趋势”就比较适合。
当数值或被观察者没有明显次序(常发生于非数值性资料)时特别有用,由于可能无法良好定义算术平均数和中位数。例子:的众数是橙。
方法:
首先定义一个结构体:
struct judgedata
{ ???? newdata;
int number;
};
struct judgedata judge[n];
其中,newdata是和 DATA 类型一致的数组.
1.判断DATA[i]是否第一次出现(用for循环在数组judge[n]中寻找).
2.是就把他放入judge[j].newdata中(假设现在judge数组中有j-1个数),同时judge[j].number置1;
3.否的话,只需找到对应的data后,judge[?].number++就可以了。
4.找到judge[n].number的最大值,对应的judge[n].newdata就是要求的那个众数。
‘叁’ c语言众数问题,while后面的scanf,看不懂,是要输入x吗
while(scanf("%d", &x)==1)确保读入一个整数,否则终止循环,使用引用是为了调用者传值
‘肆’ 如何用c语言求众数
#include<stdio.h>
int main ()
{ int n,i,j,t,max=0,a[1000][2]={0};
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&a[i][0]);
// printf("OK ");
for(i=0; i<n-1; i++)
for(j=0; j<n-1-i; j++)
if(a[j][0]>a[j+1][0])
{ t=a[j][0];
a[j][0]=a[j+1][0];
a[j+1][0]=t;
}
for(i=0; i<n;)
{ a[i][1]=1;
for(j=i+1; a[j][0]==a[i][0]; j++)
a[i][1]++;
if(a[i][1]>max)max=i;
i=j;
}
for(i=0; i<n; i++)
if(a[i][1]==a[max][1])
printf("%d ",a[i][0]);
return 0;
}
‘伍’ 用C语言找众数
1、先将数组a[N]排序(增序、降序都可以)
2、从a[i++]开始统计,若相等则计数器b[j++],如此重复。
3、在b[N]查找最大数max,并记录max在b[N]中的索引imax
4、设置标志flag = 1,若满足(b[i] == max && i != imax),则flag = 0
5、若falg = 0,返回-1,否则返回b[imax]
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
constintN=10;
voidSort(inta[],intn){
inti,j,k,t;
for(i=0;i<n-1;++i){
k=i;
for(j=i+1;j<n;++j){
if(a[k]<a[j])k=j;
}
if(i!=k){
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
}
voidShow(inta[],intn){
inti;
for(i=0;i<n;++i)
printf("%d",a[i]);
printf(" ");
}
intmain(){
inti,m,flag,imax;
inta[N],b[N];
srand((unsigned)time(NULL));
for(i=0;i<N;++i)//生成数组元素序列
a[i]=rand()%(1*N);
Sort(a,N);
Show(a,N);
b[0]=1;
for(i=1,m=0;i<N;++i){//统计各种大小数的个数
if(a[i]==a[i-1])++b[m];
elseb[++m]=1;
}
++m;
imax=0;
for(i=1;i<m;++i){//查找"众数"的个数
if(b[i]>b[imax])
imax=i;
}
flag=1;
for(i=0;i<m&&flag;++i)//是否存在众数?
if(b[i]==b[imax]&&i!=imax)
flag=0;
printf("%d ",flag?b[imax]:-1);
return0;
}
‘陆’ C语言求众数
#include<stdio.h>
int main()
{
int i,n,c,max=0,j,number;
int a[10];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
number=1;
for(j=0;j<n;j++)
{
if(a[j]==a[i])
{
number++;
}
if(max<number)
{
max=number;
c=a[i];
}
}
}
printf("该列数中众数为: %d ",c);
return 0;
}
‘柒’ C语言找众数,我想的好复杂,不知道该怎么想问题,运行结果也不对,就在此基础上,怎么改呀
// 初步测试可以实现, 可能还需要更改,重要的是思想。 自己动手完善一下吧。
// 下面用两个数组实现,如果你知道结构体的话,建议用结构体实现
#define MAXNUM 100
int PosOfThisNum(int *arr, int nLen, int nNum)
{
for(int i = 0 ; i < nLen; i++)
{
if(arr[i] == nNum)
return i;
}
return -1;
}
int main(int argc, char *argv[])
{
int arr[MAXNUM] = {0};
int i = 0;
for(;i < MAXNUM; i++)
{
scanf("%d",&arr[i]);
if(getchar() == ' ')
break;
}
int arrNum[MAXNUM] = {0};
int arrTimes[MAXNUM] = {0};
// arrNum记录所有的数
// arrTimes记录所有数出现的次数
int nCount = 0;
int nPos = 0;
for(int j = 0; j <= i; j++)
{
nPos = PosOfThisNum(arrNum, nCount, arr[j]);
if(-1 == nPos)
{
arrNum[nCount] = arr[j];
arrTimes[nCount]++;
nCount++;
}
else
{
arrTimes[nPos]++;
}
}
// 根据次数排序arrNum和arrTimes两个数组
int nTemp = 0;
int nMax = arrTimes[0];
for(int m = 0; m <= nCount; m++)
{
for(int n = m; n <= nCount; n++)
{
if(nMax < arrTimes[n])
{
nTemp = arrTimes[n];
arrTimes[n] = arrTimes[m];
arrTimes[m] = nTemp;
nTemp = arrNum[n];
arrNum[n] = arrNum[m];
arrNum[m] = nTemp;
}
}
}
// 输出次数数组前n个最大的数
printf("该数组的众数有:");
int r = 0;
for(; r < nCount; r++)
{
printf("%d ", arrNum[r]);
if(arrTimes[r] != arrTimes[r + 1])
break;
}
if(r == nCount)
{
printf("%d", arrNum[nCount]);
}
getchar();
}