POJ1002 487-3279,电话号码转换

原创 2012年03月22日 13:52:26

题目:为了更好地记忆电话号码,将数字转换成大写英文字母,字母与数字对应关系如下:

A, B, and C map to 2 
D, E, and F map to 3 
G, H, and I map to 4 
J, K, and L map to 5 
M, N, and O map to 6 
P, R, and S map to 7 
T, U, and V map to 8 
W, X, and Y map to 9 

电话号码的标准格式是7位数字,第3位和第4位之间用‘-’隔开,如888-4567。方便记忆的电话号码如TUT-GLOP对应的标准格式是888-4567。输入一系列方便记忆的电话号码,输出出现两次以上的电话号码的标准格式,输出按字典序排序。如果没有重复出现的电话号码,则输出 No duplicates.

输入:

第一行输入电话号码的个数,第二行开始输入电话号码,每个电话号码占一行,输入的电话号码由大写字母、数字和‘-’组成。

输出:

输出重复出现两次及以上的电话号码的标准格式,输出的电话号码按字典序排序。如果没有重复则输出No duplicates.


解题思路:

1 将电话号码转换成整数,则范围为0~9999999,因为范围已知,可以采用桶排序,开辟一个大小为10000000的数组A作为桶,初始化内容为0。

2 先将输入的电话号码转换成7位的整数,设为i,将A[i]的值加1。

3 输入结束后,扫描数组A,如果A[i]大于等于2,则输出i和A[i], i是电话号码,A[i]是电话号码出现的次数。

代码:

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

char getDigit(char ch)
{
  char num;
  if(ch<='9' && ch>='0') return ch-'0';	
  num = ch-'A';
  if(num > 15) num--;
  return num/3 + 2;
}


int transform(char s[])
{
	int i,result=0;
	for(i=0; i<256; i++)
	{
		if(s[i]=='\0') break;
		if(s[i] != '-') result = result*10 + getDigit(s[i]);
	}
	return result;
}

void print(int a, int count)
{
	int i=0;
	int base=1000000;
	char s[9];
	s[3]='-';
	s[8]='\0';
	for(;i<8;i++)
	{
		if(i!=3)
		{
		   s[i]=a/base+'0';
		   a = a%base;
		   base=base/10;
		}
    }
    printf("%s %d\n",s, count);
}

int main()
{
	int n,i,j,flag=0,phone;
	char s[256];
	
	int *list = (int*)malloc(10000000*sizeof(int));
	for(i=0; i<10000000; i++) list[i]=0;
	
	scanf("%d", &n);
	
	for(i=0; i<n; i++)
	{
      scanf("%s", s);
      phone = transform(s);
      list[phone]++;
	}
	
	for(i=0; i<10000000; i++)
	{
		if(list[i]>1)
		{
			flag=1;
			print(i, list[i]);
		}
	}
	if(!flag) printf("No duplicates.");
	
	return 0;
}



相关文章推荐

POJ 1002 电话号码字符串处理

这题比较简单,就是对电话号码的字符串处理并排序输出,但是实现时有几个注意的地方 1、用map存储比较方便,可以自动根据string的排序规则排序,而且题目数据恰好是的K-V存储特点。 2、...

小白的poj试练之1002

1002:方便记忆的电话号码   此题需要将一组用可能用字母表达的电话号码中重复的电话号码统计出来并按顺序打印出来。   刚拿到此题我是蒙蔽的,于是百度了一下解法,认识到了map的...
  • grom123
  • grom123
  • 2017年02月07日 11:17
  • 142

PKU OJ 1002(487-3279)电话号码解题方法与个人最简短代码

以前一次偶然的机会听说了最短代码竞赛,这两天不想干啥事,便开始做一做OJ吧, 题目见这里:http://poj.org/problem?id=1002 主要是一个字符串读取与转换,我的代码长度为651...

POJ 1002 UVA 755 487--3279 电话排序 简单但不容易的水题

题意:给你许多串字符串,从中提取电话号码,输出出现复数次的电话号码及次数。 以下是我艰难的AC历程:(这题估计是我刷的题目题解次数排前的了。。。) 题目不是很难理解,刚开始想到用map,但stl的ma...
  • hcbbt
  • hcbbt
  • 2013年07月31日 10:30
  • 1844

poj 1002 电话号码\字符串处理

...读题一定要仔细啊最后说如果电话中没有重复的号码需要输出No duplicates. 还有就是看discuss板块是有好处的 看了一些博客都说要变成数组,但是直接转换成string串我感觉更好...

POJ1002电话号码

#include #include #include using std::string; using namespace std; int n; char a[100001][20],s...

poj 1002 电话号码查重

虽然网上都说 #include #include #include using namespace std; class PhoneNUM { public: PhoneNUM(...

POJ 1002 电话号码排序查重

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 244239   Acc...

poj 1002 方便记忆的电话号码 字符串处理+排序

刚开始 做的时候  只是
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ1002 487-3279,电话号码转换
举报原因:
原因补充:

(最多只允许输入30个字)