为什么这个题我这样的解法就不对呀?
#include <iostream>
#define endl '\n'
using namespace std;
int n=0;
int a[1000]={0};
int sign[1001]={0};
int findmax()
{
int max=0;
int maxnum=0;
for(int i=0;i<1000;i++)
{
if(sign[i]==0)
{
continue;
}
else
{
if(sign[i]>maxnum)
{
max=i;
maxnum=sign[i];
}
}
}
return max;
}
int main()
{
int t=0,num=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
sign[a[i]]++;
}
for(int i=0;i<1000;i++)
{
if(sign[i]==0)
{
continue;
}
else
{
num++;
}
}
for(int i=0;i<num;i++)
{
t=findmax();
cout<<t<<" "<<sign[t]<<endl;
sign[t]=0;
}
}
你这可能是思路没问题,写代码的时候糊涂了
因为这个代码写到后面意思就不对了
思路应该是这样的:
1.将所有数字排序
for(i=1;i<n;i++){
for(j=i;j>0&&array[j]<array[j-1];j--){
temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
2.统计次数
result[0][0]=array[0];
result[0][1]=1;
count=0;
for(i=1;i<n;i++){
if(array[i]==result[count][0]){
result[count][1]++;
}else{
count++;
result[count][0]=array[i];
result[count][1]=1;
}
}
3.对次数进行排序
for(i=1;i<=count;i++){
for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
temp=result[j][0];
result[j][0]=result[j-1][0];
result[j-1][0]=temp;
temp=result[j][1];
result[j][1]=result[j-1][1];
result[j-1][1]=temp;
}
}
具体代码如下:
/*
问题描述
给定 n 个整数,请统计出每个整数出现的次数,按出现次数从多到少
的顺序输出。
输入格式
输入的第一行包含一个整数 n,表示给定数字的个数。
第二行包含 n 个整数,相邻的整数之间用一个空格分隔,表示所给定
的整数。
输出格式
输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的
次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则
先输出值较小的,然后输出值较大的。(1 ≤ n ≤ 1000,)
样例输入
12
5 2 3 3 1 3 4 2 5 2 3 5
样例输出
3 4
2 3
5 3
1 1
4 1
*/
#include<stdio.h>
int main(void){
int n;
int i,j,temp,count;
printf("请输入数字个数:");
scanf("%d",&n);
int array[n];
int result[n][2];
//输入数据
printf("请输入数据:");
for(i=0;i<n;i++){
scanf("%d",&array[i]);
}
//对数字排序
for(i=1;i<n;i++){
for(j=i;j>0&&array[j]<array[j-1];j--){
temp=array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
//统计次数
result[0][0]=array[0];
result[0][1]=1;
count=0;
for(i=1;i<n;i++){
if(array[i]==result[count][0]){
result[count][1]++;
}else{
count++;
result[count][0]=array[i];
result[count][1]=1;
}
}
//对次数进行排序
for(i=1;i<=count;i++){
for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
temp=result[j][0];
result[j][0]=result[j-1][0];
result[j-1][0]=temp;
temp=result[j][1];
result[j][1]=result[j-1][1];
result[j-1][1]=temp;
}
}
//输出
for(i=0;i<=count;i++){
printf("%d\t%d\n",result[i][0],result[i][1]);
}
return 0;
}
建议用结构体的桶存储每个数的值和它出现的次数,然后手打cmp
函数:
#include<bits/stdc++.h>
using namespace std;
int n,a[1000],t;
struct node{
int a,b;
}sign[1001];
bool cmp(node a,node b){
if(a.b==b.b)
return a.a<b.a;
return a.b>b.b;
}
int main(){
cin>>n;
for(int i=1;i<=1000;i++)
sign[i].a=i;
for(int i=0;i<n;i++){
cin>>a[i];
sign[a[i]].b++;
}
sort(sign,sign+1001,cmp);
for(int i=0;i<=1001&&sign[i].b;i++)
cout<<sign[i].a<<' '<<sign[i].b<<endl;
return 0;
}
各位大佬能看看我的代码是为什么不合适呀?我想知道自己错哪了😂