标签:编程练习
功能描述: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
标签:编程练习
原文地址:http://12756634.blog.51cto.com/12746634/1910291