【问题描述】
给出一个仅包含字母和数字(0-9, A-Z以及a-z)的字符串,请您计算频率(字符出现的次数),并仅报告哪些字符的频率是素数。
输入:
输入的第一行给出一个整数T( 0
输出:
对输入的每个测试用例输出一行,给出一个输出序列号,然后给出在输入的字符串中频率是素数的字符。这些字符按字母升序排列。所谓“字母升序”意谓按ASCII值升序排列。如果没有字符的频率是素数,输出“empty”(没有引号)。
样例输入
样例输出
3
ABCC
AABBBBDDDDD
ABCDFFFF
Case 1: C
Case 2: AD
Case 3: empty
【解题思路】
先离线计算出[2‥2200]的素数筛u[]。然后每输入一个测试串,以ASCLL码为下标统计各字符的频率p[],并按照ASCLL码递增的顺序(0≤i≤299)输出频率为素数的字符(即u[p[i]]=1且ASCLL码值为i的字符)。若没有频率为素数的字符,则输出失败信息。
【具体实现】
#include
#include
#include
#include
using namespace std;
int prime[2004] = { 0 };
char str[2004];
int size[256];
int main()
{
prime[0] = prime[1] = 1;
for (int i = 2; i
if (!prime[i])
for (int j = i * 2; j
prime[j] = 1;
int T;
while (cin >> T)
for (int t = 1; t <= T; ++t) {
cin >> str;
memset(size, 0, sizeof(size));
for (int i = 0; str[i]; ++i)
size[str[i]] ++;
cout <
int number = 0;
for (int i = 0; i
if (!prime[size[i]])
if (i >= '0' && i <= '9'
|| i >= 'A' && i <= 'Z'
|| i >= 'a' && i <= 'z') {
cout <
number++;
}
if (!number) cout <
cout <
}
return 0;
}
【额外补充】
1、extern关键字:此关键字为C语言的残留,可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。
2、函数的局部变量,其它函数怎么访问:可以在外部申请一个全局变量来获取它的值。不需要把简单的问题复杂化。