2 qq 29754969 qq_29754969 于 2016.02.09 11:44 提问

大神们,程序有什么不完善的请加以斧正
c

问题描述
  编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例
样例输入
5
100
150
150
200
250
样例输出
150
#include
int main()
{
int N,i,max=0,sum,ans;
scanf("%d",&N);
int a[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
sum=1;
for(i=0;i<N;i++)
{
if(a[i]==a[i+1])//判断是否相等的个数
sum++;//从1计数每个相等数的个数
else
{
if(max<sum)
{
max=sum;
ans=i;
}
sum=1;//重新置1
}
}
printf("%d\n",a[ans]);
return 0;
}
评测点序号 评测结果 得分 CPU使用 内存使用 下载评测数据
1 正确 10.00 0ms 1.597MB 输入 输出
2 正确 10.00 0ms 1.597MB VIP特权
3 正确 10.00 0ms 1.597MB VIP特权
4 正确 10.00 0ms 1.597MB VIP特权
5 正确 10.00 0ms 1.597MB VIP特权
6 错误 0.00 0ms 1.597MB VIP特权
7 错误 0.00 0ms 1.597MB VIP特权
8 正确 10.00 0ms 1.597MB VIP特权
9 正确 10.00 0ms 1.597MB VIP特权
10 正确 10.00 0ms 1.601MB VIP特权

4个回答

caozhy
caozhy   Ds   Rxr 2016.02.09 21:26

你的程序不满足
如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
如果输入5 3 3 1 1 2,按理说输出1,结果你输出3

caozhy
caozhy 回复天狼666: 即便如此,我的程序也没问题。
接近 2 年之前 回复
qq_29754969
qq_29754969 题目上要求数组中的值是按照从小到大的顺序排列的,所以你给出的测试数据不合适
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.09 21:33

给你写了一个

 #include<stdio.h>
int main()
{
    int N=0, x=0;
    int i;
    scanf("%d",&N);
    int a[20];
    int b[20];
    int n1 = 0;
    for(i=0;i<N;i++)
    {
        scanf("%d", &x);
        int f = 0;
        for (int i = 0; i < n1; i++)
        {
            if (x == a[i]) {b[i]++; f = 1; break;}
        }
        if (!f)
        {
            a[n1++] = x;
            b[n1 - 1] = 1;
        }
    }
    int max = 0;
    for (i = 0; i < n1; i++)
    {
        if (b[i] > b[max]) max = i;
        if (b[i] == b[max] && a[i] < a[max]) max = i;
    }
    printf("%d\n", a[max]);
    return 0;
} 
caozhy
caozhy 回复天狼666: 贴出oj地址,我可以帮你看看
接近 2 年之前 回复
caozhy
caozhy 回复天狼666: 是什么oj的网站?应该是输入输出的问题。因为你最大N只有20,不可能是性能问题,我本地测试程序也没有发现问题。
接近 2 年之前 回复
qq_29754969
qq_29754969 哥们!显示运行超时啊,你能不能再给改一下,在我的基础上稍作修改,因为在蓝桥杯应试时对程序要求比较严
接近 2 年之前 回复
qq_29754969
qq_29754969 评测点序号 评测结果 得分 CPU使用 内存使用 下载评测数据 1 运行超时 0.00 运行超时 1.593MB 输入 输出 2 运行超时 0.00 运行超时 1.597MB VIP特权 3 运行超时 0.00 运行超时 1.593MB VIP特权 4 运行超时 0.00 运行超时 1.593MB VIP特权 5 运行超时 0.00 运行超时 1.593MB VIP特权 6 错误 0.00 0ms 1.593MB VIP特权 7 错误 0.00 0ms 1.593MB VIP特权 8 运行超时 0.00 运行超时 1.593MB VIP特权 9 正确 10.00 0ms 1.593MB VIP特权 10 运行超时 0.00 运行超时 1.593MB VIP特权
接近 2 年之前 回复
qq_27183003
qq_27183003   Ds   Rxr 2016.02.09 13:28

当i=N-1时,a[i+1]下标就出界了

 for(i=0;i<N;i++)
{
if(a[i]==a[i+1])//判断是否相等的个数 
qq_29754969
qq_29754969 我自己刚才试了一下,不行啊
接近 2 年之前 回复
qq_29754969
qq_29754969 大神!帮我改一下吧!
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.02.09 12:55

数组的定义不能使用变量,只能是常量。

caozhy
caozhy 回复天狼666: 是的,大部分现代的C编译器都是可以的。lz可以忽略这个胡乱灌水的回答了。
接近 2 年之前 回复
91program
91program 回复天狼666: 由于题目已经告诉你输入个数最大为20,所以你可以将数组定义成 int a [ 20 ] 。这样最多就是输入不足20时,有部分数组的空间没有使用。
接近 2 年之前 回复
qq_29754969
qq_29754969 回复91program: 大神!那你能不能帮我改一下啊?
接近 2 年之前 回复
91program
91program 回复天狼666: 数组的定义,应该是不可以的。具体你可以编译一下,看看会不会报错就知道可不可以了。
接近 2 年之前 回复
qq_29754969
qq_29754969 这个好像可以吧,之前做一个动态数组的题,就是用这种方法!
接近 2 年之前 回复
qq_29754969
qq_29754969 这个好像可以吧,之前做一个动态数组的题,就是用这种方法!
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!