注册 登录
编程论坛 C++教室

[讨论]求一个数组的模式

风之梦 发布于 2007-10-09 20:19, 687 次点击

//该程序的目的是为了求一个数组的模式,模式定义为一个数组中出现次数最多的那个数,如果出现最大次数的数不止一个,则该数组也没有模式如1,2,2,2,4 则2是其模式,而1,1,2,2,4 则没有模式
该程序假设数组已经被排好序了
#include<iostream.h>
int mode(int a[],int n ) //求模式函数
{
int i=j=0; //i,j为数组的下标,初始都在第一个元素
x=0,r=0,count;
bool bin =false;
while(j<=n-1) //从左向右遍历数组一次
{
count=0; // 每新一次循环都把count重新置0
while(a[j]==a[i]) //从数组的开头开始,如果相等,则
{
count++; //记载这个元素重复出现的次数
j++; //i不变,j向前移动
}
if(count>x) //如果新的count的值大于原来记载在X上的最大值,则。。
{
x=count; //将新的最大值给X
rorw=true;
r=i; //r记下出现次数最多的那个元素的下标,最后被返回
}
if(count==x) //如果新出现的count和原来的最大值相等,则说明最大次数的数不止一个,则没有模式
bin=false;
i=j; //把i调到j处,继续循环
}
if(bin) return r;
else
return 0;
}
int main()
{
int x[10]={1,2,2,3,3,2,1,5,6,4};
int a;
a=mode(x,10);
if(a!=0)
cout<<x[a]<<endl;
else
cout<<"没有模式"<<endl;
return 0;
}

该程序能通过编译,但结果不对,不知道错在哪里,希望高手指点!总是输出没有模式,不管原数组是什么
愿共同进步!

7 回复
#2
succubus2007-10-09 21:05
int i=j=0 // 中文分号
x=0,r=0,count; // 变量类型呢??
rorw=true; // 这是什么

这样也能通过编译?
#3
valentineyzq2007-10-09 21:33

是啊。这是什么神奇的编译器啊?
我把你的程序进行了大改,好像没问题了:
#include<iostream>
using namespace std;
int mode(int a[],int n )
{
int i=0,j=0;
int x=0,y=0,r=0,count=0;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(a[i]==a[j]) count++;
}
if(count>x)
{
x=count;
r=a[i];
}
else if(count==x)
{
y=count;
}
count=0;
}
if(x>y) return r;
return 0;
}
int main()
{
int x[10]={1,2,2,3,3,2,1,5,6,4};
int a;
a=mode(x,10);
if(a!=0)
cout<<a<<endl;
else
cout<<"没有模式"<<endl;
return 0;
}
你的算法硬伤蛮多的,自己琢磨吧。我的说不定也有。

#4
reedleaf2007-10-09 21:51
你代码不咋好懂
我修改了一下,能得出正确结果了,



#include<iostream.h>
int mode(int a[],int n ) //求模式函数
{
int i=0,j=0; //i,j为数组的下标,初始都在第一个元素
int x=0,r=0,count;
bool bin =false;
while(j<=n-1) //从左向右遍历数组一次
{
count=0; // 每新一次循环都把count重新置0
while(a[j]==a[i]) //从数组的开头开始,如果相等,则
{
count++; //记载这个元素重复出现的次数
i++; //i不变,j向前移动
}
if(count==x) //如果新出现的count和原来的最大值相等,则说明最大次数的数不止一个,则没有模式
bin=false;
if(count>x) //如果新的count的值大于原来记载在X上的最大值,则。。
{
x=count; //将新的最大值给X
bin=true;
r=i; //r记下出现次数最多的那个元素的下标,最后被返回
}

j=i; //把i调到j处,继续循环
}
if(bin) return r-1;
else
return 0;
}
int main()
{
int x[10]={1,2,2,2,3,3,3,4,4,4};
int a;
a=mode(x,10);
cout<<a<<endl;
if(a!=0)
cout<<x[a]<<endl;
else
cout<<"没有模式"<<endl;
return 0;
}
#5
reedleaf2007-10-09 21:55

没注意
已经有解答了
#6
TenY2007-10-10 11:08
[CODE]

#include<iostream.h>
int mode(int a[],int n ) //求模式函数
{
int j=0 ;
int i=0 ; //i,j为数组的下标,初始都在第一个元素
int x=0,r=0,count;
bool bin =false;
while(j<=n-1) //从左向右遍历数组一次
{
count=0; // 每新一次循环都把count重新置0
while(a[j]==a[i]) //从数组的开头开始,如果相等,则
{
count++; //记载这个元素重复出现的次数
j++; //i不变,j向前移动
}
if(count>x) //如果新的count的值大于原来记载在X上的最大值,则。。
{
x=count; //将新的最大值给X
bin=true;
r=i; //r记下出现次数最多的那个元素的下标,最后被返回
}
else if(count == x) //如果新出现的count和原来的最大值相等,则说明最大次数的数不止一个,则没有模式
bin=false;
i=j; //把i调到j处,继续循环
}
if(bin)
return r;
else
return 0;
}
int main()
{
int x[10]={1,2,2,3,3,3,3,4,4,4};
int a;
a=mode(x,10);
if(a!=0)
cout<<x[a]<<endl;
else
cout<<"没有模式"<<endl;
return 0;
}

[/CODE]

错挺多,楼主继续加油哦.
还有既然楼主自己都假定给的数组已经排好序,所以给定的数组也一定是已排好的数组.
#7
jack_sqh2007-10-10 15:10

//该程序假设数组已经被排好序了
#include<iostream>
using namespace std;
int mode(int a[],int n )
{
int i=0,j=0;
int x=0,count=0,r=0;
for(i=0;i<n-1;){ //i=n-1没必要
for(j=i;j<n;j++){
if(a[i]==a[j])
count++;
else if(a[j] != a[i]) //终止冗余循环
break; }
if(count>x){
x=count;
r=i+1; } //记录下标加一,区别下面的r=0;
else if(count==x)
r=0; //减少条件判断
i = i+count; //跳过冗余循环
count=0;
}
return r;

}
int main()
{
int x[10]={1,1,2,2,2,3,3,4,5,6};
int a;
a=mode(x,10);
if(a != 0)
cout<<x[a+1]<<endl;
else
cout<<"没有模式"<<endl;
return 0;
}
#8
风之梦2007-10-11 12:25

谢谢大家,我又学到了很多东西,非常感谢!

1