对于解决POJ1002问题中小问题的理解

对于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上发表的感慨,对于自己没有具体方法解决这个问题感到真的很遗憾。也希望作为起点能在自己的程序员的路上越走越远

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值