根据斯诺登事件出的一道水题
2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为 FBI 的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。
丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.
(以 .
结束输出,只有 6 6 6 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩 5 5 5 分钟,你必须在这 5 5 5 分钟内编写(杜撰)一个程序,免受上司的 10000000000 m o d 10 10000000000 \bmod 10 10000000000mod10 大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字 ( ≤ 20 ) (\leq 20) (≤20),列举在下:
正规:one two three four five six seven eight nine ten eleven twelve
thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty
非正规:a both another first second third
。为避免造成歧义,another
算作 1 1 1 处理。
(2)将这些数字平方后对 100 100 100 取模,如 00 , 05 , 11 , 19 , 86 , 99 00,05,11,19,86,99 00,05,11,19,86,99。
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为 0 0 0,就去 0 0 0。
(4)找出所有排列方法中最小的一个数,即为密码。
// 数据已经修正 By absi2011 如果还有问题请联系我
一个含有 6 6 6 个单词的句子。
一个整型变量(密码)。如果没有符合要求的数字出现,则输出 0 0 0。
Black Obama is two five zero .
425
输入六个单词,判断六个单词中的数字含义,将转化成数字的单词平方后对100取余,降序排列,依次输出即可,但除了第一位不补零,其他个位数需要补零。
创建一个二维数组,用于存放明文字符串数组,
再定义一个密文,索引与明文数组对应,代表每个单词加密后的数字。
定义一个字符串用于六个单词的键入,
定义一个整型数组存储最终答案。
外部循环六次,键入字符串,内部循环遍历明文数组,使用strcmp函数,
比较字符串和明文是否一致,一致则将将明文对应的密文存入整型数组。
写一个冒泡排序,其他排序也可,对整型数组排序。
遍历整型数组,对非零元素进行打印,
值得注意的是,需要判断打印第一个非零元素不需要补零。
最后对没有答案的情况进行特判:如果没有符合要求的数字出现,则输出0。
#include
#include
//冒泡排序
void BubbleSort(int *p, int len) {
int temp;
for (int i = 0; i < len - 1; ++i) {
for (int j = 0; j < len - i - 1; ++j) {
//从小到大排序
if (p[j] > p[j + 1]) {
temp = p[j];
p[j] = p[j + 1];
p[j + 1] = temp;
}
}
}
}
int main() {
//明文
char clear[30][10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", " ten",
"eleven", "twelve", "thirteen", "fourteen", " fifteen", "sixteen", "seventeen", "eighteen",
"nineteen", " twenty", "a", "both", "another", "first", "second", "third"};
//密码
int pwd[30] = {0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 00, 21, 44, 69, 96,
25, 56, 89, 24, 61, 0, 1, 4, 1, 1, 4, 9};
//输入的每一个单词
char input[10];
//存放最终结果的数组
int res[30];
int cnt = 0;
for (int i = 0; i < 6; ++i) {
//输入单词
scanf("%s", input);
for (int j = 0; j <= 26; ++j) {
//比较单词 strcmp函数,比较字符串 相同返回0
if (strcmp(clear[j], input) == 0) {
//将字符串对应的数字存入目标数组
res[cnt] = pwd[j];
cnt++;
}
}
}
//标记变量
int flag = 1;
//降序排序
BubbleSort(res, cnt);
for (int i = 0; i < cnt; ++i) {
//打印非零元素
if (res[i] != 0) {
if (flag == 1) {
//打印第一个非零元素不需要补零
printf("%d", res[i]);
flag--;
} else {
printf("%.2d", res[i]);
}
}
}
//如果没有符合要求的数字出现,则输出0
if (flag == 1) {
printf("0");
}
return 0;
}