P1603 斯诺登的密码

题目背景

根据斯诺登事件出的一道水题

题目描述

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

样例 #1

样例输入 #1

Black Obama is two five zero .

样例输出 #1

425

1.题目分析

输入六个单词,判断六个单词中的数字含义,将转化成数字的单词平方后对100取余,降序排列,依次输出即可,但除了第一位不补零,其他个位数需要补零。

2.题目思路

创建一个二维数组,用于存放明文字符串数组,
再定义一个密文,索引与明文数组对应,代表每个单词加密后的数字。
定义一个字符串用于六个单词的键入,
定义一个整型数组存储最终答案。

外部循环六次,键入字符串,内部循环遍历明文数组,使用strcmp函数,
比较字符串和明文是否一致,一致则将将明文对应的密文存入整型数组。

写一个冒泡排序,其他排序也可,对整型数组排序。

遍历整型数组,对非零元素进行打印,
值得注意的是,需要判断打印第一个非零元素不需要补零。
最后对没有答案的情况进行特判:如果没有符合要求的数字出现,则输出0。

3.代码实现

#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;
}

你可能感兴趣的:(刷题go,go,go,c语言,数据结构)