1002

此题主要是字符串转换 + 哈希表

 

#include <stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

#define HASH_MAX 100000

typedef 
struct _node {
    
int key;
    
int count;
}
Node;
Node hashTbl[HASH_MAX] 
= {0};

int map[] = {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
char str[100];

int cmp(const void* pa, const void* pb)
{
    
return ((Node*)pa)->key - (((Node*)pb)->key);
}


int read()
{
    
int i, k = 0;
    
int ret = 0;
    scanf(
"%s", str);
    
for (i = 0; i < strlen(str); ++i) {
        
if (str[i] == '-'continue;
        
if (str[i] >= '0' && str[i] <= '9')
            ret 
= ret*10 + str[i] - '0';
        
else
            ret 
= ret*10 + map[str[i]-'A'];
    }

    
return ret;
}


int main()
{
    
int cnt;
    
int tmp;
    
int hashkey;
    
int i, j, tag;
    
    
for (i = 0; i < HASH_MAX; ++i) hashTbl[i].key = -1;

    scanf(
"%d"&cnt);
    
for (i = 0; i < cnt; ++i) {
        tmp 
= read();
        hashkey 
= tmp%100000;
        
if (hashTbl[hashkey].key == tmp)
            hashTbl[hashkey].count
++;
        
else {
            
for (j = hashkey; hashTbl[j].key!=tmp && hashTbl[j].key!=-1; j = (j+1)%HASH_MAX);
            hashTbl[j].count
++;
            hashTbl[j].key 
= tmp;
        }

    }

    qsort(hashTbl, HASH_MAX, 
sizeof(Node), cmp);
    
for (i = HASH_MAX-1; i>=0 && hashTbl[i].key!=-1--i);
    tag 
= 0;
    
for (i++; i < HASH_MAX; ++i) {
        
if (hashTbl[i].count > 1{
            printf(
"%03d-%04d %d\n", hashTbl[i].key/10000, hashTbl[i].key%10000, hashTbl[i].count);
            tag 
= 1;
        }

    }

    
if (!tag) printf("No duplicates.");

    system(
"pause");
    
return 0;
}

 

posted @ 2009-04-11 11:30  断桥残雪  阅读(193)  评论(0)    收藏  举报