c语言重数
A. c语言 众数问题
临时做了一个,参考下
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,*p;
int i,j,count;
int maxn=0,max=0;
scanf("%d",&n);//输入个数
if(n>0)
{
p=(int*)calloc(sizeof(int),n);//开辟内存,并初始化为0
}
else
{
printf("error input\n");
return 1;
}
for(i=0;i<n;i++)//扫描元素
scanf("%d",p+i);
for(i=0;i<n;i++)
{
if(p[i]==-1) continue;//-1的元素直接跳过,减少检索次数
count=1;//每次按1个处理
for(j=i+1;j<n;j++)
if(p[i]==p[j])
{
p[j]=-1;//利用自然数从0开始,如果重复,设置为-1
count++;
}
if(count>maxn)
{
max=p[i];
maxn=count;
}
}
printf("\n%d\n%d\n",max,maxn);//输出
free(p);//释放资源
getchar();
return 0;
}
B. C语言如何用众数法实现查找一组数据中的最大众数和最小众数
你的意思是有多个众数的情况下,其中最大的叫最大众数,最小的叫最小众数是吗?
#include<stdlib.h>
#include<stdio.h>
#include <time.h>
int main()
{
srand(time(NULL));
int all[100];
for (int i = 0; i < 100; all[i++] = rand() % 49 + 1);
int times[51] = { 0 };
for (int i = 0; i < 100; times[all[i++]]++);
int max_index = 0;
int tmp = 0;
for (int i = 1; i <= 50; i++)
{
if (times[i] >= tmp)
{
tmp = times[i];
max_index = i;
}
}
int min_index = 0;
tmp = 0;
for (int i = 50; i >= 1; i--)
{
if (times[i] >= tmp)
{
tmp = times[i];
min_index = i;
}
}
printf("最大众数是: %d,最小众数是: %d", max_index, min_index);
}
C. 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就是要求的那个众数。
D. 如何用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;
}
E. C语言求众数问题
算法很多。大致思路如下:
定义数据范围:如0-100,
定义数组1:int a[101]//标保证任何数据都可以容纳,并且初始化为0。
定义数组2:int data[n] //待处理数组,自己初始化。
代码如下:
#include<stdio.h>
void main()
{
int a[101]={0};
int nMax = 0;
int data[50] = {1,3,4,2,13,4,2,1.....};//这个你自己初始化
for(int i=0;i<50;i++)
a[data[i]]++;
for(int n=0;n<101;n++)
{ if(nMax<a[n])
nMax = a[n];
}
for(int k=0;k<101;k++)
{
if(nMax == a[k])
printf("%4d,%4d\n",nMax,k);
}
}
F. C语言找众数,我想的好复杂,不知道该怎么想问题,运行结果也不对,就在此基础上,怎么改呀
我首先是要说思路问题:
收集完所有数据后,只保存输入次数的最大值是不够的,还需要判断出输入次数的最小值。只有最大值==最小值的时候才能判断出所有数字的输入次数都一样。
然后是代码格式问题:
很多for语句和if语句你没有写大括号,还有一些代码3个分号写了一行。这在正规项目中是不允许的,因为增加了写错的可能性,也不便于阅读。
#include<stdio.h>
#defineMAXNUM100+10
inta[MAXNUM+1]={0};
intmain()
{
inti,m,t,MAX,n,x,MIN,cmax,cmin;//M指代不明确,改了
intc[MAXNUM]={0};
//输入一组整数
for(i=0;i<MAXNUM;)
{
scanf("%d",&a[i++]);
if(getchar()==' ')
break;
}
m=i;
MAX=a[0];
MIN=a[0];
//判断众数:统计每个数出现的次数,t出现的次数为c[t]
for(i=0;i<m;i++)
{
t=a[i];
c[t]++;
}
//这段代码目的应该是找出输入数据的最大值,减少后面步骤循环次数吧。
for(i=1;i<m;i++)
{
if(a[i]>MAX)
{
//不需要修改a数组中的输入数据!
MAX=a[i];
}
if(a[i]<MIN)
{
MIN=a[i];
}
}
//输入次数取值范围就是0-m,至于为什么初值要反着来,你可以思考下。
cmax=0;
cmin=m;
//找出c数组中的最大和最小数值。最小数值不能低于1,因为0代表没输入过。
for(i=MIN;i<=MAX;i++)//是小于等于,否则MAX的数据就没了。
{
if(c[i]>cmax)
{
//仍然不懂你为什么要修改c数组
cmax=c[i];
}
if(c[i]<cmin&&c[i]!=0)
{
cmin=c[i];
}
}
if(cmax==cmin)
{
printf("没有众数、 ");
}
else
{
printf("众数为%d ",cmax);
}
return0;
}
G. C语言 如何编个程序求一组数的中位数和众数
数组排序可以不用指针。你把数组定义成全局变量,比如说a[10001];然后调用我给你的快排程序就行了,这个程序可以背下来,很有用的。
void
qs(int
L,int
R)
{
int
i=L,j=R,mid=a[(L+R)/2],t;
while(i<j)
{
while(a[i]<mid)
++i;
while(a[j]>mid)
--j;
if(i<=j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
++i;
--j;
}
}
if(i<R)
qs(i,R);
if(L<j)
qs(L,j);
}
排好序之后找中位数就好办了。
至于众数,我觉得最好的方法是用bfs。但这个对你来说难度有点大,我就给你写一个hash表吧。还用上面的那个数组,且假定数组a中的最大值不超过10000,若超过,你把下面这个hash数组的范围扩大就行了。
另外,设a中有n个元素,a从1开始计数(若从0开始,你改一下就好了)
int
hash[10001]={0};
int
i,Max=0;
for(i=1;
i<=n;
++i)
{
++hash[a[i]];
if(hash[a[i]]>hash[Max])
Max=a[i];
}
最后输出Max就好了
刚t415422663倒是提醒我了,如果要判断众数有多个,我可以把上面的程序稍改一下
int
hash[10001]={0};
int
i,Max=-1;/*注意,这里把Max赋值为-1是为了防止数组a的元素个数为0时所有数据都被输出*/
for(i=1;
i<=n;
++i)
{
++hash[a[i]];
if(hash[a[i]]>Max])
Max=hash[a[i]];
}
//10000是数组a中可能出现的最大值,这个你可以自己改的
for(i=1;
i<=10000;
++i)
if(hash[i]==Max)
printf("%d\n",i);
H. 用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;
}
I. C语言编程,求众数
int
a[n],A[n];
不能这样定义的吧。。。
A[a[i]]++;
这句有问题!
若输入的a[i]大于n,则超出了A的下标范围
访问数组超范围的下标,就会Runtime
Error。。。
J. 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;
}