对于POJ1002问题设计的一些感悟
问题:
要求计算数字或者字母组成的7位数号码中,重复号码的出现次数并且将其转换为XXX-XXXX数字形式
字母转换要求:
A,B和C映射到2
D,E和F映射到3
G, H和I映射到4
J,K,和L映射到5
M,N和O映射到6
P,R和S映射到7
T,U,和V映射到8
W,X,和Y映射到9的
没有包括字母Q和Z的映射
特殊要求:
连字符不能拨号,可以根据需要添加和删除(可以在输入过程中间随意插入)
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100000
int cmp(const void *a, const void *b)
{
int *x = (int *)a;
int *y = (int *)b;
return (*x) - (*y);
}
int main()
{
int cnt = 0; //存放电话号码个数
int iter = 0;
int Noduplicates = 0; //有无重复号码的标志,为0则表示无重复
int Sum = 0;
int icount = 0;
char ch; // 接收键盘输入字符
int *PHONE = (int *)malloc(sizeof(int) * (MAXSIZE + 10));
scanf("%d",&cnt);
getchar();
//获取所有电话号码,转换为整型数据
for(iter = 0; iter < cnt; iter++)
{
Sum = 0;
ch = getchar();
while(ch != '\n')
{
if(ch >= '0' && ch <= '9')
{
Sum = Sum * 10 + ch - '0' ;
}
else if(ch >= 'A' && ch <= 'P')
{
Sum = Sum * 10 + (ch - 65) / 3 + 2 ;
}
else if(ch >= 'R' && ch <= 'Y')
{
Sum = Sum * 10 + (ch - 66) / 3 + 2 ;
}
ch = getchar();
}
PHONE[iter] = Sum;
}
//用快排对电话号码排序
qsort(PHONE, cnt, sizeof(int), cmp);
//输出排好顺序的号码
for(iter = 0, icount = 1; iter < cnt - 1 ; iter++)
{
icount = 1;
//统计重复号码个数
while(PHONE[iter] == PHONE[iter + 1])
{
iter++;
icount++;
}
if(icount > 1)
{
Noduplicates = 1;
printf("%03d-%04d %d\n",PHONE[iter] / 10000 ,PHONE[iter] % 10000 ,icount);
}
}
if(Noduplicates == 0)
{
printf("No duplicates.\n");
}
getchar();
return 0;
}
该代码是某CSDN的作者发表的
我作为小白我第一次接触的POJ题目。在看他的算法思想时总结出自己犯了几个低级的问题:
1。自己对于while,for的模糊定义
2。对于ASCII码的不熟悉导致自身在数据转换问题上的疑惑
3。对于对最后题目格式的构筑没有明确的认识
在算法的设计上自身的想法有以下问题:
1。对于如何删掉输入中“-”的方法没有有效方法
2。对于筛选的方法上,没有意识到需要排序的重要性
3。在设计过程中,没有意识到标志量能作为最后判别没有重复的判断依据
这是我第一篇CSDN上发表的感慨,对于自己没有具体方法解决这个问题感到真的很遗憾。也希望作为起点能在自己的程序员的路上越走越远