洛谷 P1603 【斯诺登的密码】

本文介绍了一种处理英文数字的算法,通过将英文数字转换为对应的运算结果,并利用排序算法找出最小值的方法。文章详细解释了如何读取包含英文数字的句子,将其转换为数值并进行排序,最后输出最小的组合数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很久以前(几个月前吧)就注意到了这题,然而。。。看了两眼就懒得思考了。。。以后好几次都是这样,今天算是还债吧。

建议大家先把英文数字和对应运算结果的表打好,这样就很方便(这时候就不用保留0了,比如10^2=100,100%100=0,题目里说是00,这时候先直接赋值为0,后面再做判断)

因为题目说了每个句子就是6个单词,所以直接i 1~6循环读入

然后每次读入都判断一下是不是英文数字,如果是就加到一个数组里(把运算结果放进去)

把数组排序(因为要求最小嘛)

先判断一下句子里有没有英文数字,没有直接输出0

然后把数组里的值都输出

注意:根据题目要求“组成一个新数,如果开头为0,就去0”,说明除了第一个,后面每个数如果只有一位都要在十位补上一个0

#include<iostream>
#include<algorithm>
using namespace std;
string yw[30]={"","one","two","three","four","five","six","seven",
"eight","nine","ten","elven","twelve","thirteen","fourteen","fifteen",
"sixteen","seventeen","eighteen","nineteen","twenty","a","both",
"another","first","second","third"}; 
int sz[30]={0,1,4,9,16,25,36,49,64,81,0,21,44,69,96,25,56,89,24,61,0,
1,4,1,1,4,9};
int k;
int a[10];

int main()
{
	for(int i=1;i<=6;i++)
	{
		string x;
		cin>>x;//直接用变量读就行了
		for(int j=1;j<=26;j++)//26种英文数字
			if(yw[j]==x)
				{a[++k]=sz[j];break;}//k记录有几个英文数字
	}
	if(k==0){cout<<0<<endl;return 0;}//先判断一下句子中有没有英文数字
	sort(a+1,a+k+1);//排序
	for(int i=1;i<=k;i++)
	{
		if(i!=1&&a[i]<10)cout<<0;//补0
		cout<<a[i];
	}
	cout<<endl;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值