首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

恒生电子笔考试题

2012-11-09 
恒生电子笔试题请对输入的一组数据(0~9)进行排序,规则:数据出现次数多的,数字大的排在前面。例如:6 3 9 4排

恒生电子笔试题
请对输入的一组数据(0~9)进行排序,规则:数据出现次数多的,数字大的排在前面。
例如:6 3 9 4 排序后:9 6 4 3
例如:6 3 3 9 4 排序后:3 9 6 4

[解决办法]
我一大神同学想出来的,开数组int a[10];然后,每出现一次该数,该位加10,然后随便用个排序法排序后,取10余输出即可。
[解决办法]
论坛里有:
http://topic.csdn.net/u/20121018/20/0ab1305d-9378-48b6-b5d2-884f46d97dc7.html?36066
[解决办法]

C/C++ code
// Map.cpp : Defines the entry point for the console application.//#include "stdafx.h"typedef struct{    int Myself;    int Record;}HS;void select_sort(int *x, int n){    int i, j, min, t;        for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/    {        min = i; /*假设当前下标为i的数最小,比较后再调整*/        for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/        {            if (*(x+j) < *(x+min))            {                   min = j; /*如果后面的数比前面的小,则记下它的下标*/            }        }                  if (min != i) /*如果min在循环中改变了,就需要交换数据*/        {            t = *(x+i);            *(x+i) = *(x+min);            *(x+min) = t;        }    }};int main(int argc, char* argv[]){    HS H_S[10];    int Temp,i=0,HW[10]={0};    for(i=0;i<10;i++)    {        H_S[i].Myself=i;        H_S[i].Record=0;    }    printf("请输入5个0-9之间的数字:");    for (int m=0;m<5;m++)    {            scanf("%d",&Temp);        switch(Temp)        {            case 0:                H_S[0].Record++;                break;            case 1:                H_S[1].Record++;                break;            case 2:                H_S[2].Record++;                break;            case 3:                H_S[3].Record++;                break;            case 4:                H_S[4].Record++;                break;            case 5:                H_S[5].Record++;                break;            case 6:                H_S[6].Record++;                break;            case 7:                H_S[7].Record++;                break;            case 8:                H_S[8].Record++;                break;            case 9:                H_S[9].Record++;                break;        }    }    Temp=0;    for (i=0;i<10;i++)    {        if (H_S[i].Record==0)            continue;        else         {            HW[Temp]=H_S[i].Record*10+H_S[i].Myself;            Temp++;        }    }     select_sort(HW, Temp);     for(i=Temp-1;i>-1;i--)     {         printf("%d",(HW[i]%10));     }    return 0;}
[解决办法]
这个相当于是2级排序,就是说
struct
{
int number;
int times;
};

就是先排序times,如果times相同在按照number的大小排序。

用qsort可以做到。

baidu qsort ACM
[解决办法]
探讨

我一大神同学想出来的,开数组int a[10];然后,每出现一次该数,该位加10,然后随便用个排序法排序后,取10余输出即可。

[解决办法]
写了个,用冒泡排序写的
C/C++ code
#include <stdio.h>typedef struct _Digit{    int num;    int cnt;} Digit;void sort(Digit *d){    int i, j;    Digit t;    for(i = 0; i < 10 - 1; ++i)        for(j = 0; j < 10 - i - 1; ++j){            if(d[j].cnt  < d[j+1].cnt || (d[j].cnt == d[j+1].cnt && d[j].num < d[j+1].num)){                t = d[j];                d[j] = d[j+1];                d[j+1] = t;            }        }}int main() {    Digit digit[10];    int i;    for(i = 0; i < 10; ++i){        digit[i].num = i;        digit[i].cnt = 0;    }    int n, num;    scanf("%d", &n);    while(n > 0){        scanf("%d", &num);        digit[num].cnt++;        --n;    }    sort(digit);    for(i = 0; i < 10; ++i)        if(digit[i].cnt)            printf("%d ", digit[i].num);    return 0;} 

热点排行