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;
}



poj1002 487-3279(电话号码重复次数)

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 205583   Acc...
  • a451907
  • a451907
  • 2013年02月23日 09:02
  • 477

【宿舍菜鸟们的ACM解题笔记】487-3279

题目来源 北大ACM,题目ID 1002,难度 初级。 题目简介 Description Businesses like to have memorable telepho...
  • XIAXIA__
  • XIAXIA__
  • 2014年11月04日 21:44
  • 1690

C++——字符串例题——487-3279(POJ1002)

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 285398   Acc...
  • McDonnell_Douglas
  • McDonnell_Douglas
  • 2017年01月21日 14:05
  • 232

POJ1002电话号码字符串

题目意思: 输入一个串,里面包含一些数字和一些大写字母,以及 - ,字母变换成数字,保证了7个数字,输出重复出现超多1次的电话号码以及次数。规模1e5。 粽子,被这个题目坑了很久,首先是用字符串保...
  • u013188850
  • u013188850
  • 2014年11月26日 00:11
  • 276

poj1002 487-3279 (简单字符串处理)

大致题意是首先一个整形变量表示n输入字符串的数量,然后紧跟n行字符串表示的号码,期中字符ABCD……分别映射相应的数字,特别值得注意的是,只有这个号码出现的次数大于1才会在结果中输出,否则输出 No ...
  • u013008084
  • u013008084
  • 2013年12月01日 14:45
  • 334

OJ 系列之重复的电话号码(C_C++)

解题思路:首先建立题目要求的映射关系,其次将输入的字符串进行提取,转换成电话号码,利用map容器的有序性质进行存储电话号码,电话号码自动有序,然后按照题目要求进行输出即可。#include #inc...
  • xy010902100449
  • xy010902100449
  • 2016年02月21日 10:34
  • 1085

1002:487-3249(电话号码转换)

Description Businesses like to have memorable telephone numbers. One way to make a telephone number...
  • wengeyiming
  • wengeyiming
  • 2016年04月11日 09:21
  • 95

企业喜欢用容易被记住的电话号码

1.  问题描述 企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容 易记住的单词或者短语。例如,你需要给 Waterloo 大学打电话时,可以拨打 TUT-GLOP。 有...
  • qq_36143023
  • qq_36143023
  • 2016年11月04日 21:19
  • 1256

一个字典树问题--电话号码转化问题(POJ 1002 487-3279)

字典树,又称为单词查找树,Trie树。是一种用于快速检索多叉树的结构。典型应用于统计,排序和保存大量字符串。利用字符串的前缀来减少存储空间,减少无谓的比较,提高查询效率。 字典树根节点不包含任何数据...
  • wh921021
  • wh921021
  • 2013年04月05日 15:31
  • 1938

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

以前一次偶然的机会听说了最短代码竞赛,这两天不想干啥事,便开始做一做OJ吧, 题目见这里:http://poj.org/problem?id=1002 主要是一个字符串读取与转换,我的代码长度为651...
  • luofl1992
  • luofl1992
  • 2013年07月28日 14:16
  • 1033
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ1002 487-3279,电话号码转换
举报原因:
原因补充:

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