题目
源地址:
http://poj.org/problem?id=1002
理解
简单一看就是一道关于字典的题目,将ABC等字符转化为对应的数字,从而求出这个字符串所对应的电话号码。 然后就是我不机智的地方了。我求出的电话号码依然是使用char数组类型保存的,比较的时候使用了strcmp函数,为了降低复杂度,还使用了各种标记,最后就是一团乱麻。在点拨之后才发现,直接转化为int型,然后sort排序,轻松搞定。
#新技能get
以前就在困惑使用cout的时候如何控制它的输出形式,解题过程中,在cplusplus上面找到了一个库iomanip
。通过setfill
和setw
函数的配合,解决了在数字之间插入一个-
的问题。
代码
# include <iostream>
# include <algorithm>
# include <iomanip>
using namespace std;
int normal(char a)
{
{
if (a == 'A' || a == 'B' || a == 'C')
return 2;
if (a == 'D' || a == 'E' || a == 'F')
return 3;
if (a == 'G' || a == 'H' || a == 'I')
return 4;
if (a == 'J' || a == 'K' || a == 'L')
return 5;
if (a == 'M' || a == 'N' || a == 'O')
return 6;
if (a == 'P' || a == 'R' || a == 'S')
return 7;
if (a == 'T' || a == 'U' || a == 'V')
return 8;
if (a == 'W' || a == 'X' || a == 'Y')
return 9;
}
}
int time[10000000];
bool vist[10000000];
int out[100000];
int main()
{
int n;
while (cin >> n)
{
memset(time, 0, sizeof(time));
memset(vist, 0, sizeof(vist));
int positive = 0;
bool flag = false;
for (int i = 1; i <= n; i++)
{
int x = 0;
char s[20];
cin >> s;
for (int j = 0; s[j] != '\0'; j++)
{
if (s[j] == '-' || s[j] == 'Q' || s[j] == 'Z')
continue;
else if (s[j] <= '9')
x = x * 10 + s[j] - '0';
else if (s[j] <= 'Z')
x = x * 10 + normal(s[j]);
}
time[x]++;
if (!vist[x] && time[x] >= 2)
{
flag = true;
vist[x] = true;
out[positive++] = x;
}
}
if (!flag)
cout << "No duplicates." << endl;
else
{
sort(out, out + positive);
for (int i = 0; i < positive; i++)
{
cout << setfill('0') << setw(3) << out[i] / 10000;
cout << '-';
cout << setfill('0') << setw(4) << out[i] % 10000;
cout << ' ' << time[ out[i] ] << endl;
}
}
}
return 0;
}
更新日志
- 2014年07月03日 完成解题报告