梦想是代码一写就对 2023-04-09 19:18 采纳率: 65%
浏览 33
已结题

用c++实现众数重数问题

#include<iostream>
#include<fstream>
using namespace std;
void Searchz(int arr[],int &z,int &c); 
void QuickSort(int a[],int p,int r ) ;
int partition(int a[],int p,int r);
main()
{
    int arr[4];
    fstream ofile;
    ofile.open("D:\\imput.txt",ios::in);
    for(int i=0;i<4;i++)
    ofile>>arr[i];//从文件中输入 
    QuickSort(arr,0,3);
    fstream oufile;
    oufile.open("D:\\output.txt",ios::out);
    int z=-1,c=-1;//众数、重数 
    Searchz(arr,z,c);
    oufile<<"众数为:"<<z<<" 重数为:"<<c<<endl; //输出到文件中 
    ofile.close();
    oufile.close();
}
void Searchz(int arr[],int &z,int &c)
{
    int zt=-1,ct=-1;//临时众数、临时重数
    for(int i=0;i<4;i++)
    {
      if(arr[i]!=zt)
      {
          zt=arr[i];ct=1;
      }    
      else if(arr[i]==zt)ct++;
      if(ct>c)//关键代码,比较出真正的重数 
      {
          c=ct;z=zt;//临时赋给真正的 
      }
    } 
} 
//快速排序 
void QuickSort(int a[],int p,int r)
{
    if(p<r)
    {
        int q=partition(a,p,r);
        QuickSort(a,p,q-1);
        QuickSort(a,q+1,r);
    }
}
int partition(int a[],int p,int r)
{
    int i=p,j=r+1;
    int x=a[p],temp;
    while(1)
    {
        while(a[++i]<x&&i<r);
        while(a[--j]>x);
        if(i>=j) break;
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    a[p]=a[j];
    a[j]=x;
    return j;
}

如果不用文件输入输出的话,代码可以正常运行,但是用文件输入输出,结果永远都是众数为0重数为2,不知道问题出在哪里

  • 写回答

3条回答 默认 最新

  • AI迅剑 2023-04-09 20:02
    关注
    
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int num=0; //存储众数
    int sum=0; //存储重数
    
    int count(int a[],int s,int e){//计算中间数出现的次数
        int n=a[(s+e)/2];
        int counts=0;
        for(int i=s;i<e;i++)  { 
             if(a[i]==n) 
                  counts++;
        }
       return counts;
    }
    
    int start(int a[],int s,int e){ //找到中间数出现的位置
         int x=0;
         for(in   t i=s;i<e;i++)  {
            if(a[i]==a[(p+q)/2]) {
                x=i;
                break;
           }
        }
        return x;
    }
    
    void mode(int a[],int s,int e){
         int  tnum=(s+e)/2;          
         int  tsum=count(a,s,e);    
         int left=start(a,s,e);     
         if(tsum>sum)  { 
        sum=tsum;           num=a[tnum];
         }
        if(q-(left+tsum)>sum) mode(a,left+tsum,e);
        if(left>sum) mode(a,s,left);
    }
    
    int main()
    {
        int a[10]={2,1,3,2,5,2,3,3,3,3};
        cout<<mode(a,0,9)<<endl;
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 创建了问题 4月9日

悬赏问题

  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵
  • ¥15 cfx离心泵非稳态计算