洛谷P1603 斯诺登的密码

题目背景

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

题目描述

题目描述

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个单词的句子。

输出格式:

一个整型变量(密码)。

输入输出样例

输入样例#1:  复制
Black Obama is two five zero .
输出样例#1:  复制
425




整体思路就是按照题目给的这些单词列出一个表,遇到单词就查,没查到就返回空。返回的结果是事先算好的平方数%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;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值