暴力破解与实用性原则:

1)暴力破解的第一原则:实用性。

2)枚举法。

3)逆向解法。

真题一   年龄谜题

美国数学家维纳(N.Wiener)智力早熟,11 岁就上了大学。 他曾在 1935-1936 年应邀来中国清华大学讲学。 一次,他参加某个重要会议,年轻的脸孔引人注目。 于是有人询问他的年龄,他回答说:“我年龄的立方是个 4 位数。我年龄的 4 次方是个6 位数。这 10 个数字正好包含了从 0 到 9 这 10 个数字,每个都恰好出现 1 次。”请你推算一下,他当时到底有多年轻。

解题思路:

假设年龄是在1-50岁之间,暴力破解便是将1-50全部算出再筛选。

1)计算1-50的立方以及4次方,剔除掉立方不是4位数的以及4次方不是6位数的结果。

很明显,在这里就已经可以看出答案是18岁。暴力破解原则就是要实用、高效、快速。

2)将年龄的立方以及4次方串起来,判断这10个数字是否正好包含了从0到9这10个数字,每个都恰好出现1次。

思路:判断0-9是否都出现在串中。

完整代码:

public class Main{public static void main(String[] args){for (int i=1; i<50; i++) {int a = i*i*i;int b = a * i;if((a+"").length() != 4 || (b+"").length() != 6)    //判断年龄的立方是否4位数以及4次方是否6位数continue;String s = "" + a + b;System.out.println(i + ": " + s + " " + isAnswer(s));}}//判断是否是答案public static boolean isAnswer(String s){for (int i=0; i<10; i++) {if(s.indexOf(i+"") == -1) //0-9只要有一个不包含在s串中,直接返回falsereturn false;}return true;}}

结果:

真题二:古罗马数字(枚举法)

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。 之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 0 的概念! 罗马数字的表示主要依赖以下几个基本符号:

I --> 1
V --> 5
X --> 10
L --> 50
C --> 100
D --> 500
M --> 1000

这里,我们只介绍一下 1000 以内的数字的表示法。
单个符号重复多少次,就表示多少倍。最多重复 3 次。

比如: CCC 表示 300 XX 表示 20,但 150 并不用 LLL 表示,这个规则仅适用于 I  X C M。

如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。

比如: IX 表示 9 ,IV 表示 4 ,XL 表示 40  , 49 = XLIX

更多的示例参见下表,你找到规律了吗?
I = 1
II = 2
III = 3
IV = 4
V = 5
VI = 6
VII = 7
VIII = 8
IX = 9
X = 10
XI = 11
XII = 12
XIII = 13
XIV = 14
XV = 15
XVI = 16
XVII = 17
XVIII = 18
XIX = 19
XX = 20
XXI = 21
XXII = 22
XXIX = 29
XXX = 30
XXXIV = 34
XXXV = 35
XXXIX = 39
XL = 40
L = 50
LI = 51
LV = 55
LX = 60
LXV = 65
LXXX = 80
XC = 90
XCIII = 93
XCV = 95
XCVIII = 98
XCIX = 99
C = 100
CC = 200
CCC = 300
CD = 400
D = 500
DC = 600
DCC = 700
DCCC = 800
CM = 900
CMXCIX = 999

本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

输入格式是:第一行是整数 n,表示接下来有 n 个罗马数字(n<100)。 以后每行一个罗马数字。罗马数字大                              小 不 超 过 999。 要求程序输出 n 行,就是罗马数字对应的十进制数据。

例如,用户输入:
    3
    LXXX
    XCIII
    DCCII
则程序应该输出:
   80
   93
   702

解题思路:

1、遍历罗马数字字符串的每一个字符,将每个字符所对应的十进制数相加起来。

2、因为存在着小单位在大单位左边这种情况,而且还不是所有的小单位放到大单位左边都成立。所以单单第一步是不够的,然而总结规律,这种特殊情况却少之又少:

IV:4         IX:9
    XL:40       XC:90
    CD:400    CM:900

因此,接下来就是直接枚举出这6种情况,对上述第一步所得出的sum进行补偿即可。

完整代码:

import java.util.Scanner;public class Main{public static void main(String[] args){String[] romeNums = new String[n];Scanner s = new Scanner(System.in);int n = s.nextInt();for(int i=0; i<n; i++){romeNums[i] = s.next();}for(int i=0; i<n; i++){System.out.println(romeNumToDec(romeNums[i]));}}public static int romeNumToDec(String romeNum){int sum = 0;for (int i=0; i<romeNum.length(); i++) {char c = romeNum.charAt(i);if(c == 'I')  sum += 1;if(c == 'V') sum += 5;if(c == 'X') sum += 10;if(c == 'L')    sum += 50;if(c == 'C')    sum += 100;if(c == 'D')   sum += 500;if(c == 'M')   sum += 1000;      }//对sum进行补偿 if(romeNum.indexOf("IV") != -1)  sum -= 2;if(romeNum.indexOf("IX") != -1)    sum -= 2;if(romeNum.indexOf("XL") != -1)    sum -= 20;if(romeNum.indexOf("XC") != -1)   sum -= 20;if(romeNum.indexOf("CD") != -1)   sum -= 200;if(romeNum.indexOf("CM") != -1)  sum -= 200;return sum;}
}

结果:

问题:如何保证输入的罗马数字是正确的呢?

解决:可以采用逆向解法。

1)将罗马数字转为十进制数字;

2)设计一个方法,将所得到的十进制反而再转化为罗马数字;

3)将转化来的罗马数字与之前的比较看是否一致。

1、暴力破解与实用性原则相关推荐

  1. 蓝桥杯算法特训 | C++ | 暴力破解与实用性优先

    课程主要内容 暴力破解与实用性优先 (1)暴力破解在大赛及企业应用中的重要性 (2)暴力破解中的实用性原则 (3)逆向解法 (4)枚举法 关键词:枚举(情况少的时候).逆向解法(逆算).试探观察(试解 ...

  2. 第一课:暴力破解与实用性优先

    暴力是一种解决非常多问题的常用方法,解决问题之前应当先考虑是否课暴力,并非所有题都可暴力,但是暴力是一个很好的思路. 第一题:年龄谜题 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学. ...

  3. (蓝桥杯第一课)暴力破解与实用性优先

    杂谈--蓝桥杯该如何应对 打好基础最重要 90%是暴力破解,是其他高级算法的i 出 注重解决问题的能力 一.年龄谜题 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学. 他曾在1935~1 ...

  4. Java--算法特训(1)暴力破解和实用性优先(题目二)

    关键词:列表法,枚举法(将规律写死在程序里!) 测试先行的写代码的方式: 1 public class testsuanfa { 2 public static int romeNum(String ...

  5. 如何面对高水平的破解组织 谈暴力破解应对

    如何面对高水平的破解组织 谈暴力破解应对 2005-05-09, 11:18 sanit 共享软件是目前世界上软件业比较热门的话题,国内更是如此.成千上万的中国程序员以极大的热情投入到这个领域来,都憧 ...

  6. java反射(暴力破解)

    前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 一.名词解释 1.什么是Java反射机制? 答:运行时动态获得类信息以及动态调取类中的成分的能力 2.反射的步骤(重点): 反射的第一步都 ...

  7. web漏洞之暴力破解

    漏洞概述 暴力破解-枚举.通过利用大量猜测和穷举的方式来尝试获取用户口令的攻击方式,就是猜口令.攻击者一直枚举进行请求,通过对比数据包的长度可以判断是否爆破成功,因为爆破成功和失败的数据包长度不一样. ...

  8. 入门系列之使用fail2ban防御SSH服务器的暴力破解攻击

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由SQL GM 发表于云+社区专栏 介绍 对于SSH服务的常见的攻击就是暴力破解攻击--远程攻击者通过不同的密码来无限次地进行登录尝试. ...

  9. 服务器暴力破解的程序(python开发)

    如果您对服务器暴力破解和Python相关知识有兴趣,与大神们共同探讨和 首先我们看一下基本的原理以及过程 Paste_Image.png 我们看一下准备工作: 我们需要获取目标机器的IP和SHH端口 ...

最新文章

  1. python匹配中文
  2. 证书访问_3+证书|高考注册页面可访问,具体流程看这里!
  3. UVa 11136 - Hoax or what
  4. 【CodeForces - 574C】Bear and Poker(思维,剪枝,数学)
  5. c++ regex用法实例
  6. 家里有古玩古董摆放在家中好吗?
  7. Python中zip函数
  8. 开放 Rake 打包项目
  9. List遍历的三种方式
  10. java post 注册_使用post request python注册帐户
  11. 粒子滤波matlab示例,[转载]粒子滤波Matlab示例
  12. 使用 Flash 描述复杂的社交网络
  13. java lambda排序
  14. 在Google工作的十年,也是我开心的十年
  15. pentaho java,用于创建Pentaho报告的Java代码,此报告接受输入作为数据集成(.ktr)文件...
  16. gcc 中-O1 -O2 -O3 优化的原理
  17. 一篇网络流的好blog
  18. 把ipa文件上传到App Store教程步骤
  19. 2021年中国教育行业发展现状及未来发展趋势分析:在校生人数达2.91亿人[图]
  20. Java中getBytes()方法--使用详解

热门文章

  1. php使用mpdf将html导出为pdf文件
  2. QQ潮玩展2021QTX摄影作品 (zhaoolee出品)
  3. W3cshool的html表单标签和元素内容思维导图笔记整理
  4. 【狄拉克量子力学原理】【4】对易,相容
  5. IEC101测试工具
  6. 基于Halcon提取图像外轮廓并提取保存轮廓相关数据
  7. 小学计算机电子手抄报计划,电子手抄报制作教程:小学生用WORD制作电子手抄报的方法和技巧...
  8. 电脑回收站删除的文件怎么找回?
  9. 一个平庸程序员自白:我不牛逼但那又怎样?
  10. 手把手教你输出1000到2000之间的闰年