字符串的简单匹配

1603

斯洛登的密码:

题目描述

查时却发现,斯诺登杳无踪迹。但是,在据说是斯诺登的座位上,发现了一张纸条。纸条由纯英文构成: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)找出所有排列方法中最小的一个数,即为密码。

输入输出格式

输入格式:

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

输出格式:

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

1.分析:

1)题意分析:
     题目里面我们就把字符串转转换成数字进行操作

2)1>该如何判断指定的字符串以及如何将字符串和相应的数字对应起来

 

char dic[30][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"}; 
int di[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};

 

if(!strcmp(s[i],dic[j])){
    a[++top] = di[j];
}
//对于我们需要的判断是否字符串符合这些个相应
//利用strcmp来进行相等判断 strcmp(char1,char2);

     2>如何消除最后输出的时候前面可能出现的“0”

//利用flag来判断这个输出是不是字段首个
for(j = 1;j <= top;j++) {
		if(flag)
			printf("%.2lld",a[j]);
		else{
			if(a[j]){
				printf("%lld",a[j]);
				flag=1;
			}
		}
	}

      3>如何求最小的数字组合

sort(a+1,a+top+1);
//进行快排 从小到大进行排序

 

#include <iostream>
#include <algorithm>
#include <cstdio>
#include<cstring>
using namespace std;
char dic[30][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"}; 
int di[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};
unsigned long long int a[10],top,flag;
long long int i,j;
char s[100][100];
int main()
{
	for(i = 1;i <= 6;i++){
		cin >> s[i];
		for(j = 0;j <= 26;j++){
			if(!strcmp(s[i],dic[j])){
				a[++top] = di[j];
			}
		}
	}
	sort(a+1,a+top+1); 
	for(j = 1;j <= top;j++) {
		if(flag)
			printf("%.2lld",a[j]);
		else{
			if(a[j]){
				printf("%lld",a[j]);
				flag=1;
			}
		}
	}
	if(!flag)	printf("0");
	return 0;
}


有一个输入和输出的技巧:

我们在输入的时候用空格分隔char类型的时候,IDE会把每个字符串分开,以空格为一个标准。

输出的时候,用”.2d%”两位数,不足的时候直接补零。

 

点赞