洛谷:P1603 斯诺登的密码 题解

题目背景

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

题目描述

2013 年 X 月 X 日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机。但是,这件事情太不周密了,因为 FBI 的间谍早已获悉他的具体位置——但这不是最重要的——最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中。

丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成:Obama is a two five zero.(以 . 结束输出,只有 66 个单词+一个句号,句子开头如没有大写亦为合法)这句话虽然有点无厘头,但是警官陈珺骛发现这是一条极其重要的线索。他在斯诺登截获的一台笔记本中找到了一个 C++ 程序,输入这条句子后立马给出了相对应的密码。陈珺鹜高兴得晕了过去,身为警官的你把字条和程序带上了飞机,准备飞往曼哈顿国际机场,但是在飞机上检查的时候发现——程序被粉碎了!飞机抵达华盛顿只剩 55 分钟,你必须在这 55 分钟内编写(杜撰)一个程序,免受上司的 10000000000 mod 1010000000000mod10 大板。破译密码的步骤如下:

(1)找出句子中所有用英文表示的数字 (≤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 算作 11 处理。

(2)将这些数字平方后对 100100 取模,如 00,05,11,19,86,9900,05,11,19,86,99。

(3)把这些两位数按数位排成一行,组成一个新数,如果开头为 00,就去 00。

(4)找出所有排列方法中最小的一个数,即为密码。

输入格式

一个含有 66 个单词的句子。

输出格式

一个整型变量(密码)。如果没有符合要求的数字出现,则输出 00。

输入输出样例

输入 

Black Obama is two five zero .

输出 

425
#include<iostream>
#include<string>
using namespace std;
string e[30] = 
{ "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" };//对应
//直接字符串拼接
string di[30] = { "0","01","04","09","16","25","36","49","64","81","00","21","44","69","96","25","56","89","24","61","0","1","4","1","1","4","9"};
unsigned long long int a[10], k, flag;
string str, ch, u;
bool flag1 = false;
string f1(string s)
{
	for (int i = 0; i < 30; i++)
	{
		if (s == e[i]) //如果相等返回对应字符串
		{
			flag1 = true;
			return di[i];
		}
	}
	return "-1";
}
int main()
{
	getline(cin, str); 
	for (int i = 0; i < str.size(); i++)
	{
		if (str[i] == ' ')
		{
			flag = i;
			if (f1(ch) != "-1"&&f1(ch)!="0")
			{
				u += f1(ch); 
			}
			ch.clear();
		}
		else
		{
			ch += str[i]; //将每个用空格分隔的单词找出来
		}
	}
	ch = str.substr(flag + 1);
	if (f1(ch) != "-1" && f1(ch) != "0")
		u += f1(ch);
	if (!flag1) //判断有没有找到数字单词
	{
		cout << 0 << endl;
		return 0;
	}
	if (u[0] == '0') //如果字符串第一个是0,就把他去掉
		u = u.substr(1);
	cout << u; //输出
	return 0;
}

字符串拼接直接秒了哈哈。

算法小白的刷题日记

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值