标签:编程练习
功能描述: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