【编程练习】电话本号码转换加排序

功能描述:http://poj.org/problem?id=1002

解决关键:

1)使用数值数组代替二维数组——数组角标表示排序的号码,元素的值记录出现的次数;利用数值的天然大小顺序直接按顺序记录标准化后的号码。

2)至于格式问题,不一定拘泥于将格式写入字符串,直接控制格式化字符串。

PS.因为号码不会变化且唯一,所以可以这样使用——如果用出现次数(变化的量)排序就不这么方便了。

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

int simplify(char *a){//将名称化的电话号码标准化
	int iLen=strlen(a);
	int i=0;
	char b;//存储标准变化
	int res=0;

	for(i=0;i<iLen;i++){//判断这个字符应该转换成什么
		if(a[i]>=‘A‘&&a[i]<‘Q‘){//字母
			b=(a[i]-‘A‘)/3+‘2‘;
			res=res*10+b-‘0‘;
		}
		else if(a[i]>‘Q‘&&a[i]<‘Z‘){
			b=(a[i]-‘A‘-1)/3+‘2‘;
			res=res*10+b-‘0‘;
		}

		else if(a[i]>=‘0‘&&a[i]<=‘9‘){
			b=a[i];
			res=res*10+b-‘0‘;
		}
	}
	return res;
}
int arr[10000000] = {0};//用来记录标准化后的号码的出现次数——利用1-1000000本身的顺序
int main(){
	int iNum,i,j,iLen=0;
	char szInput[100]={0};
	int value=0;

	int flag=0;

	int max=-1, min=10000001;

	char temp[20]={0};
	int n=7;
	//printf("\n====================\n");
	scanf("%d",&iNum);

	for(i=0;i<iNum;i++){
		scanf("%s",szInput);

		value=simplify(szInput);//标准化

		arr[value]++;//计数
		min=min<value?min:value;
		max=max>value?max:value;
	}
	for(i=min;i<=max;i++){
		if(arr[i]>1){
			//itoa(i,szInput,10);
			//iLen=strlen(szInput);
			//j=7-iLen;
			//n=7;
			//while(n>=0){
			//	if(n==3){
			//		temp[n--]=‘-‘;
			//		continue;
			//	}
			//	if(iLen>=0)
			//		temp[n]=szInput[iLen-1];
			//	else
			//		temp[n]=‘0‘;
			//	n--;
			//	iLen--;
			//}
			printf("%03d-%04d %d\n",i/10000,i%10000,arr[i]);
			flag=1;
		}
	}
	if (!flag)
	{
		printf("No duplicates.\n");
	}

	//main();
	return 0;
}
时间: 2024-12-11 01:43:32

【编程练习】电话本号码转换加排序的相关文章

WP8 电话本编程

通讯录搜索:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh286416(v=vs.105).aspx过滤条件:http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh286417(v=vs.105).aspx 程序联系人存储的API在空间Windows.Phone.PersonalInformation下,下面来看一下如何去使用这些API来操作联系

华为第六届创新编程大赛第一轮 电话本题目

比赛的时候提交不了,先把题目记下来 电话号码本 描述: 实现一个简易电话号码本的程序,存储电话号码,可以通过名字获取电话号码,同时也可以通过电话号码获取对应的名字.说明:    1.名字由英文字母组成,区分大小写.1<=字母数量<=20    2.名字和电话号码一一对应    3.名字和电话号码均唯一    4.电话号码长度n,由数字组成.1<= n <=20    5.电话号码本中最大的记录条数为200运行时间限制: 无限制 内存限制:  无限制 输入:  输入命令字如下:sav

记一次开发:Qt简单电话本程序

前言 断断续续学习C++一年了,现在要做课设,觉得控制台界面实在太难看,于是用Qt做一个图形化的程序出来. 学习Qt也没有多久,只是了解了个大概,这次开发基本上是啃了2天的官方帮助文档,然后利用各种Qt提供的轮子实现的.有些地方做的确实还很不完善,不过似乎没有什么致命的bug. 代码质量底下,谨慎模仿. Qt真的是一个很好的C++扩展库,学习完C++觉得没有用武之地的可以去学习一下Qt来开发几个图形化软件来练练手. 项目介绍 实现一个简单的电话本程序,能够实现添加.查找.修改.删除.保存到文件等

POJ C++程序设计 编程题#9:人群的排序和分类

编程题#9:人群的排序和分类 来源: 北京大学在线程序评测系统POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 总时间限制: 1000ms 内存限制: 1024kB 描述 对人群按照输入的信息进行排序和分类. #include <iostream> #include <set> #include <iterator> #include <algorithm> using namespace std; // 在此处补

用结构体实现一个电话本

结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?     一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等).我们先来定义一个结构体.     typedef struct Pdhb-info     {       char name[5];       char sex[3];       int age;       char tele[12];       char addr[30];     }Pd

数据结构——树——二叉查找树转换成排序的循环双向链表

题目描述 输入一棵二叉查找树,将该二叉查找树转换成一个排序的循环双向链表. 要求不能创建任何新的结点,只调整指针的指向,也不能开辟新的存储空间O(1) 题目分析 首先照旧我们问题的解决思路,首先简化问题.(前提你应该了解二叉查找树和双向链表) 如果没有任何的要求,那么我们自然会想到遍历整棵树然后排序出来之后重新构建一个链表即可,你想要什么样的都可以. 那么我们需要考虑的就是如何遍历? 然后慢慢复杂问题,不能新建立,那么就要在原来的基础上改,怎么改才能变过去呢? 这时,我要教你对于树的问题,有一招

微信电话本的未来在农村

一夜之间,微信电话本就在用户的手机联系人之间广为流传,似乎微信电话本真的火.真的如此吗?何玺认为,微信电话本的火爆可能是暂时的假象,就它目前的功能不做改进的话,用不了多久,它就将成为过去. 关于微信电本 据微信团队介绍,使用微信电话本拨打电话,需要通话双方都下载该APP并开通免费通话功能.免费通话功能无法在对方没有安装微信电话本.或者没有微信登录(安装了微信的情况下).或者号码未开通免费功能的情况下直接拨打. "微信电话本"通话功能本身免费,但在2G/3G/4G网络下会消耗流量,WiF

微信电话本可免费拨打网络电话 通话一分钟约300K流量

微信电话本新版本于昨日晚间发布,这是一款智能通讯增强软件,通话双方都下载此APP并开通免费通话功能就能使用微信电话本拨打免费网络电话,在对方无法接通情况下还能将音频转向语音信箱,微信电话本目前支持Android和iOS两个版本.朋友圈一时炸开了锅,很多人都第一时间下载体验. 用户如要使用微信电话本免费通话功能,需要在微信电话本内登录微信账号,并绑定本人手机号,开通后找到已开通此功能的联系人便可免费拨打网络电话.当给对方电话未接时,会自动转入语音留言.对方的留言可以在通话记录详情页进行收听.微信电

python list去重加排序

列表去重加排序 有很多种方法 mylist=[1,'233','w',24324,34,12,3,4] mylist2=[] for i in mylist: #循环遍历列表 if i not in mylist2: #判断 遍历到的数据是否在列表2中 mylist2.append(i) #如果不存在添加到新的列表2中 print(mylist2) 它只是去重 mylist=[5,6,4,1,'h','a','f','a',2,4,2,1] li =list(set(mylist)) #先转换成