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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程练习电话本号码转换加排序相关的知识,希望对你有一定的参考价值。

功能描述: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;
}


本文出自 “12746634” 博客,请务必保留此出处http://12756634.blog.51cto.com/12746634/1910291

以上是关于编程练习电话本号码转换加排序的主要内容,如果未能解决你的问题,请参考以下文章

GEEK编程练习— —发糖果问题

C语言编程作业,急!!!!

在iOS中以编程方式拨打带有访问代码的电话号码

练习题四:电话号码分身

jQuery代码段,用于在重新键入号码时将其转换为美国电话号码格式

Python实践练习:电话号码和 E-mail 地址提取程序