poj1002-487-3279(字符串处理)

一,题意:
  中文题,不解释!
二,思路:
  1,处理输入的电话号码
  2,排序num[]数组
  3,输出
三,步骤:
  1,消除 -、Q、Z 三种字符,将一个电话号码转化为一个整数存如num[]数组
    如:num[0]=4873279;
  2,快排函数:sort(num.num+t)  头文件:#include<algorithm>
  3,输出前面3位,后面4位,已经出现的次数(记住使用输出格式设置符的时候加头文件:iomanip)
    i,设置3位的宽度set(3)、除以10000之后不足3位的补0(setfill('0'))、
      cout << setfill('0') << setw(3) << num[i] / 10000;
      cout << '-';
    ii,设置4位的宽度set(4)、对10000取余之后不足4位的补0(setfill('0'))、
      cout << setfill('0') << setw(4) << num[i] % 10000;
      cout << ' ' << count << endl;
四,注意:
  1,所有电话号码中,一个重复的都没有才输出"No duplicates.",而且只出现一次的不输出。
  2,测试用例中会出现Q和Z,这两个字母要处理
  3,字符数组要开大些,,小了结果不正确
  4,注意电话号码开头是0的,也照样输出0

 1 #include<iostream>
 2 #include<algorithm>        
 3 #include<cstring>
 4 #include<iomanip>        //I/O流控制头文件
 5 using namespace std;
 6 
 7 int ctoi(char ch)  //把字符ch转换为其在手机上对应的数字键
 8 {
 9     if (ch == 'A' || ch == 'B' || ch == 'C')
10         return 2;
11     if (ch == 'D' || ch == 'E' || ch == 'F')
12         return 3;
13     if (ch == 'G' || ch == 'H' || ch == 'I')
14         return 4;
15     if (ch == 'J' || ch == 'K' || ch == 'L')
16         return 5;
17     if (ch == 'M' || ch == 'N' || ch == 'O')
18         return 6;
19     if (ch == 'P' || ch == 'R' || ch == 'S')
20         return 7;
21     if (ch == 'T' || ch == 'U' || ch == 'V')
22         return 8;
23     if (ch == 'W' || ch == 'X' || ch == 'Y')
24         return 9;
25 }
26 
27 //注意:定义长度比较大的数组,最好定义在主函数外(即堆内存中)
28 char ch[10000000];    //存储一行未处理的电话号码
29 int num[10000000];    //存储多行已处理的电话号码(如:num[0]=4873279)
30 
31 int main() {
32     int t;
33     while (cin >> t) {
34         for (int i = 0; i < t; i++) {
35             cin >> ch;
36             for (int j = 0, k = 0; j < strlen(ch); j++) {
37                 if (ch[j] == '-' || ch[j] == 'Q' || ch[j] == 'Z')
38                     continue;
39                 else if (ch[j] <= '9')
40                     num[i] = num[i] * 10 + ch[j] - '0';
41                 else if (ch[j] <= 'Z')
42                     num[i] = num[i] * 10 + ctoi(ch[j]);
43             }
44         }
45 
46         sort(num, num + t);                //快排函数sort头文件
47         bool flag = false;
48         int count = 1;
49         for (int i = 0; i < t; i++) {
50             if (num[i] == num[i + 1]) {
51                 count++;
52                 flag = true;
53             }
54             else {
55                 if (count > 1) {
56                     cout << setfill('0') << setw(3) << num[i] / 10000;
57                     cout << '-';
58                     cout << setfill('0') << setw(4) << num[i] % 10000;
59                     cout << ' ' << count << endl;
60                 }
61                 count = 1;
62             }
63         }
64 
65         if (!flag) {
66             cout << "No duplicates." << endl;
67         }
68     }
69     return 0;
70 }
View Code

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/My-Sunshine/p/4933239.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值