POJ1002是个电话号码的问题
两种思路:
第一种:转换成整数数组,再进行排序,然后统计出现的次数。
printf("%03d-%04d %d", head, tale, count) //格式输出,刚开始时用的是%3d,一直不行,需要用%03d将空位用0补齐。
代码如下:
方法1:524K 579MS C++
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#define MAX 256
int cmp(const void *a, const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int num;
char map[26] =
{'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','Q','7','7','8','8','8','9','9','9','Z'};
char data[10], pstr[256];
int i, j, k;
scanf("%d", &num);
int *res = (int *)malloc(num * sizeof(int));
for(i=0;i<num;i++)
{
scanf("%s", pstr);
k=0;
for(j=0;j<strlen(pstr);j++){
if(pstr[j]>='A'&&pstr[j]<='Z')
data[k++] = map[pstr[j]-'A'];
else if(pstr[j]>='0'&&pstr[j]<='9')
data[k++] = pstr[j];
else
continue;
}
data[k] = '\0';
res[i]=atoi(data);
}
qsort(res,num,sizeof(int),cmp);
int count = 1;
int head, tale;
int flag = 0;
for(i=0;i<num;i++){
while(i<num-1 && res[i+1] == res[i]){
count ++;
i ++;
}
if(count > 1){
head = res[i] / 10000;
tale = res[i] % 10000;
printf("%03d-%04d %d\n", head, tale, count);
count = 1;
flag = 1;
}
}
if(!flag)
printf("No duplicates.\n");
free(res);
return 0;
}
第二种:用Hash数组,需要的空间比较大。
代码如下:
39320K 657MS C++
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
int hash[10000000];//需要的空间太大,默认情况下栈的大小不够,不能在函数里当局部变量
int main(){
char map[26] =
{'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','Q','7','7','8','8','8','9','9','9','Z'};
memset(hash,0,10000000);
long num, max = 0, min = 10000000;
int cur;
long i, j;
int k;
char tel[256], tmp[256];
scanf("%d", &num);
for(i=0; i<num;i++){
scanf("%s", tel);
k = 0;
for(j=0;j<strlen(tel);j++){
if(tel[j]>='A'&&tel[j]<='Z')
tmp[k++] = map[tel[j]-'A'];
else if(tel[j]>='0'&&tel[j]<='9')
tmp[k++] = tel[j];
else
continue;
}
tmp[k] = '\0';
cur = atoi(tmp);
if(cur>max) max = cur;
if(cur<min) min = cur;
hash[cur]++;
}
int flag = 0, head, tale;
for(i=min;i<=max;i++){
if(hash[i]>1){
head = i / 10000;
tale = i % 10000;
printf("%03d-%04d %d\n",head,tale,hash[i]);
flag = 1;
}
}
if(!flag)
printf("No duplicates.\n");
return 0;
}