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;
}
typedef 
浙公网安备 33010602011771号