题目背景
根据斯诺登事件出的一道水题
题目描述
题目描述
2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.(以"."结束输出,只有6个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个C++程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩5分钟,你必须在这5分钟内编写(杜撰)一个程序,免受上司的10000000000%10大板。破译密码的步骤如下:
(1)找出句子中所有用英文表示的数字(≤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
(2)将这些数字平方后%100,如00,05,11,19,86,99。
(3)把这些两位数按数位排成一行,组成一个新数,如果开头为0,就去0。
(4)找出所有排列方法中最小的一个数,即为密码。
// 数据已经修正 By absi2011 如果还有问题请联系我
输入输出格式
输入格式:一个含有6个单词的句子。
输出格式:一个整型变量(密码)。
输入输出样例
整体思路就是按照题目给的这些单词列出一个表,遇到单词就查,没查到就返回空。返回的结果是事先算好的平方数%100的字符串。然后个字符串数组排个序,遍历字符串数组把它们连起来,然后去除前导0输出。我还考虑了如果输入的本身就是数字的情况,不知道应不应该考虑,但还是写上了。
这道题学到了。
1.long long 转 string
string lltoString(long long t)//long long 转string
{
std::string result;
std::strstream ss;
ss << t;
ss >> result;
return result;
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include <strstream>
using namespace std;
string Words[6];//存储数字
bool isDigital(string tmp)//判断字符串是否为数字
{
for (int i = 0; i < tmp.length();i++)
if (tmp[i] >= 48 && tmp[i] <= 57)
continue;
else
return false;
return true;
}
string lltoString(long long t)//long long 转string
{
std::string result;
std::strstream ss;
ss << t;
ss >> result;
return result;
}
string getStandard(string test)//获得标准的平方后的数字
{
int len = test.length();
if (len == 0)
test += "00";
else if (len == 1)
test = '0' + test;
return test;
}
bool isFit(string test, string goal)//判断两字符串是否一样
{
for (int i = 0; i < test.length(); i++)
{
if (test[i] == goal[i])
continue;
else
return false;
}
return true;
}
string lessthan20(string word)
{
if (isFit(word, "one"))
return "01";
else if (isFit(word, "a"))
return "01";
else if (isFit(word, "first"))
return "01";
else if (isFit(word, "another"))
return "01";
else if (isFit(word, "second"))
return "04";
else if (isFit(word, "both"))
return "04";
else if (isFit(word, "two"))
return "04";
else if (isFit(word, "third"))
return "09";
else if (isFit(word, "three"))
return "09";
else if (isFit(word, "four"))
return "16";
else if (isFit(word, "five"))
return "25";
else if (isFit(word, "six"))
return "36";
else if (isFit(word, "seven"))
return "49";
else if (isFit(word, "eight"))
return "64";
else if (isFit(word, "nine"))
return "81";
else if (isFit(word, "ten"))
return "00";
else if (isFit(word, "eleven"))
return "21";
else if (isFit(word, "twelve"))
return "44";
else if (isFit(word, "thirteen"))
return "69";
else if (isFit(word, "fourteen"))
return "96";
else if (isFit(word, "fifteen"))
return "25";
else if (isFit(word, "sixteen"))
return "56";
else if (isFit(word, "seventeen "))
return "89";
else if (isFit(word, "eighteen"))
return "24";
else if (isFit(word, "nineteen"))
return "61";
else if (isFit(word, "twenty"))
return "00";
return "";
}
int cmp(string a, string b)
{
return a<b;
}
int main()
{
int num = 0;
int index = 0;
string word;
while (cin >> word)
{
if (word[0] == '.')
break;
long long number;
if (isDigital(word))//如果输入的字符串本身就是数字的话
{
number = atol(word.c_str());
number = (number*number) % 100;
Words[index++] = getStandard(lltoString(number));
}
else//输入的是表里的单词的话
{
word[0] = tolower(word[0]);//第一个字母变小写
string str= lessthan20(word);
if (str.length() != 0)
Words[index++] = str;
}
}
if (index == 0)//如果没有字符串就输出0
{
cout << 0;
}
else
{
string ans ;
sort(Words, Words + index, cmp);//从小到大排序
for (int i = 0; i < index; i++)
{
ans += Words[i];
}
int tmp;
for (tmp = 0; ans[tmp];tmp++)//找到第一个不是0的位置
if (ans[tmp] != '0')
break;
if (tmp == ans.length())//如果全是0就输出0
cout << 0;
else
{
for (; ans[tmp]; tmp++)//从第一个不是0的地方放输出
cout << ans[tmp];
}
}
return 0;
}