问题描述请看原帖:http://www.iteye.com/topic/399628 直接给出代码
import java.util.Collection; import java.util.LinkedList; /** * @Filename: NumberCode.java * @Description: 八段码 * @author: luw. * @version: 1.0 * @Create at: 2010-9-15 上午09:13:28 */ public enum NumberCode { /** 0 */ ZERO(0, 0x3F), /** 1 */ ONE(1, 0x06), /** 2 */ TWO(2, 0x5B), /** 3 */ THREE(3, 0x4F), /** 4 */ FOUR(4, 0x66), /** 5 */ FIVE(5, 0x6D), /** 6 */ SIX(6, 0x7D), /** 7 */ SEVEN(7, 0x07), /** 8 */ EIGHT(8, 0x7F), /** 9 */ NINE(9, 0x6F); // A(10, 0x77), // B(11, 0x7C), // C(12, 0x39), // D(13, 0x5E), // E(14, 0x79), // F(15, 0x71); private int value; private byte code; private NumberCode(int value, int code) { this(value, (byte) code); } private NumberCode(int value, byte code) { this.value = value; this.code = code; } public int intValue() { return this.value; } public byte codeValue() { return this.code; } /** * 自身移动N位得到的数字 * * @param change * 改变的位数 * @return */ public Collection<NumberCode> canConverts(int change) { Collection<NumberCode> numberCodes = new LinkedList<NumberCode>(); int bitNum = countBit(this.code); for (NumberCode nc : values()) { if (this == nc) { continue; } if (countBit(nc.code) == bitNum && countBit(nc.code | this.code) - bitNum == change) { numberCodes.add(nc); } } return numberCodes; } /** * 增加N位得到数字 * * @param change * 增加的位数 * @return */ public Collection<NumberCode> addConverts(int change) { Collection<NumberCode> numberCodes = new LinkedList<NumberCode>(); int bitNum = countBit(this.code); for (NumberCode nc : values()) { if (this == nc) { continue; } if (countBit(nc.code) - bitNum == change && countBit(nc.code | this.code) - bitNum == change) { numberCodes.add(nc); } } return numberCodes; } /** * 减少N位得到的数字 * * @param change * 减少的位数 * @return */ public Collection<NumberCode> subConverts(int change) { Collection<NumberCode> numberCodes = new LinkedList<NumberCode>(); int bitNum = countBit(this.code); for (NumberCode nc : values()) { if (this == nc) { continue; } final int num = countBit(nc.code); if (bitNum - num == change && countBit(nc.code | this.code) - num == change) { numberCodes.add(nc); } } return numberCodes; } @Override public String toString() { return String.valueOf(value); } /** * 计算二进制数种1的个数 * * @param code * @return */ public static int countBit(int code) { int iCode = code; iCode = (iCode & 0x55555555) + (iCode >>> 1 & 0x55555555); // 得到每2位二进制数中1的个数 iCode = (iCode & 0x33333333) + (iCode >>> 2 & 0x33333333); // 得到每4位二进制数中1的个数 iCode = (iCode & 0x0F0F0F0F) + (iCode >>> 4 & 0x0F0F0F0F); // 得到每8位二进制数中1的个数 iCode = (iCode & 0x00FF00FF) + (iCode >>> 8 & 0x00FF00FF); // 得到每16位二进制数中1的个数 iCode = (iCode & 0x0000FFFF) + (iCode >>> 16 & 0x0000FFFF);// 以此类推可以得到N位二进制数中1的个数 return iCode; } public static NumberCode valueOf(char val) { return valueOf(val - 48); } public static NumberCode valueOf(int val) { switch (val) { case 0: return ZERO; case 1: return ONE; case 2: return TWO; case 3: return THREE; case 4: return FOUR; case 5: return FIVE; case 6: return SIX; case 7: return SEVEN; case 8: return EIGHT; case 9: return NINE; default: throw new AssertionError("Unknown val: " + val); } } }
* @Filename: Operator.java * @Description: 运算符 * * @author: luw. * @version: 1.0 * @Create at: 2010-9-15 上午09:30:10 */ public enum Operator { /** 加 */ ADD('+') { @Override public double calculate(double num1, double num2) { return num1 + num2; } @Override public double calcNum1(double result, double num2) { return SUBTRACT.calculate(result, num2); } @Override public double calcNum2(double result, double num1) { return SUBTRACT.calculate(result, num1); } }, /** 减 */ SUBTRACT('-') { @Override public double calculate(double num1, double num2) { return num1 - num2; } @Override public double calcNum1(double result, double num2) { return ADD.calculate(result, num2); } @Override public double calcNum2(double result, double num1) { return calculate(num1, result); } }, /** 乘 */ MULTIPLY('*') { @Override public double calculate(double num1, double num2) { return num1 * num2; } @Override public double calcNum1(double result, double num2) { return DIVIDE.calculate(result, num2); } @Override public double calcNum2(double result, double num1) { return DIVIDE.calculate(result, num1); } }, /** 除 */ DIVIDE('/') { @Override public double calculate(double num1, double num2) { return num1 / num2; } @Override public double calcNum1(double result, double num2) { return MULTIPLY.calculate(result, num2); } @Override public double calcNum2(double result, double num1) { return calculate(num1, result); } }; private final char op; private Operator(char op) { this.op = op; } @Override public String toString() { return " " + op + " "; } /** * 计算两个数之间进行(加/减/乘/除)后的结果 * * @param num1 * 第一个数(操作符左边的那个数) * @param num2 * 第二个数(操作符右边的那个数) * @return */ public abstract double calculate(double num1, double num2); /** * 根据结果和第二个操作数得到第一个操作数 * * @param result * 结果 * @param num2 * 第二个操作数 * @return */ public abstract double calcNum1(double result, double num2); /** * 根据结果和第一个操作数得到第二个操作数 * * @param result * 结果 * @param num1 * 第一个操作数 * @return */ public abstract double calcNum2(double result, double num1); public static Operator valueOf(char op) { switch (op) { case '+': return ADD; case '-': return SUBTRACT; case '*': return MULTIPLY; case '/': return DIVIDE; default: throw new AssertionError("Unknown op: " + op); } } }
import java.io.IOException; import java.io.InputStreamReader; import java.util.Collection; import java.util.LinkedList; /** * @Filename: NumberTest.java * @Description: * * @author: luw. * @version: 1.0 * @Create at: 2010-9-15 上午09:38:37 */ public class NumberTest { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); NumberCode[] nums = new NumberCode[3]; Operator op = null; while (true) { System.out.println("Enter your value:"); String str = br.readLine(); str = str.replace(" ", ""); long nanoTime = System.nanoTime(); int j = 0; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == '=') { continue; } if (Character.isDigit(c)) { nums[j++] = NumberCode.valueOf(c); } else { op = Operator.valueOf(c); } } for (String s : moveMatch(op, nums[0], nums[1], nums[2])) { System.out.println(s); } System.out.println("用时 " + (System.nanoTime() - nanoTime) + "ns\n"); } } public static Collection<String> moveMatch(Operator op, NumberCode num1, NumberCode num2, NumberCode result) { Collection<String> equations = new LinkedList<String>(); int change = 1; // 可移动的火柴根数 for (NumberCode n : num1.canConverts(change)) { if (op.calculate(n.intValue(), num2.intValue()) == result.intValue()) { equations.add(n.toString() + op + num2 + " = " + result); } } for (NumberCode n : num2.canConverts(change)) { if (op.calculate(num1.intValue(), n.intValue()) == result.intValue()) { equations.add(num1.toString() + op + n + " = " + result); } } for (NumberCode n : result.canConverts(change)) { if (op.calculate(num1.intValue(), num2.intValue()) == n.intValue()) { equations.add(num1.toString() + op + num2 + " = " + n); } } Collection<NumberCode> subNum1s = num1.subConverts(change); Collection<NumberCode> subNum2s = num2.subConverts(change); Collection<NumberCode> subResults = result.subConverts(change); for (NumberCode n1 : num1.addConverts(change)) { for (NumberCode n2 : subNum2s) { if (op.calculate(n1.intValue(), n2.intValue()) == result.intValue()) { equations.add(n1.toString() + op + n2 + " = " + result); } } for (NumberCode r : subResults) { if (op.calculate(n1.intValue(), num2.intValue()) == r.intValue()) { equations.add(n1.toString() + op + num2 + " = " + r); } } } for (NumberCode n2 : num2.addConverts(change)) { for (NumberCode n1 : subNum1s) { if (op.calculate(n1.intValue(), n2.intValue()) == result.intValue()) { equations.add(n1.toString() + op + n2 + " = " + result); } } for (NumberCode r : subResults) { if (op.calculate(num1.intValue(), n2.intValue()) == r.intValue()) { equations.add(num1.toString() + op + n2 + " = " + r); } } } for (NumberCode r : result.addConverts(change)) { for (NumberCode n1 : subNum1s) { if (op.calculate(n1.intValue(), num2.intValue()) == r.intValue()) { equations.add(n1.toString() + op + num2 + " = " + r); } } for (NumberCode n2 : subNum2s) { if (op.calculate(num1.intValue(), n2.intValue()) == r.intValue()) { equations.add(num1.toString() + op + n2 + " = " + r); } } } return equations; } }
相关推荐
目录介绍特征安装用法设置一个MappedValueRepresentable枚举使用MappedValueCollectionRepresented 使用MappedEnum类型的可编码枚举在ESet中使用OptionSet中的EnumSet 将EnumSet转换为Enum数组使用...
在给定的描述中,我们看到的是一个在使用ADO(ActiveX Data Objects)库时遇到的`enum`类型重定义问题。 ADO 是 Microsoft 提供的一个用于访问数据库的组件,它包含了一些枚举类型来表示数据库操作的状态,如 `EOF`...
在这个“enum 结构分析源码”资源中,我们主要关注的是C语言中的枚举使用和实现。C语言中的enum并不是一种真正的类型,而是对整型变量的一种别名,它提供了更易读的常量名称。 首先,我们来看`enum.c`这个源文件。...
6. **灵活性**:当枚举位于类外部时,可以更方便地进行静态导入,避免每次使用枚举时都写全其类型名,提高代码的简洁性。 不过,有时枚举确实需要与特定的类紧密结合,此时可以考虑将其置于类体内。例如,枚举只...
枚举元素列表必须写在枚举类的最前面,每个元素之间用逗号隔开,元素列表结束位置后若没有其他内容,则可以不写分号,否则必须要写。例如: ```java public enum Color { RED, BLUE, BLACK, YELLOW, GREEN } ``` 2....
本篇将通过"Java Enum使用Demo源码"深入探讨Java枚举的用法。 首先,枚举在Java中是一个类,可以通过`enum`关键字来声明。例如,我们可以创建一个表示星期的枚举类型: ```java public enum WeekDay { MONDAY, ...
本教程将深入探讨如何在Laravel项目中使用enum类,以及它能为代码质量、可读性和可维护性带来的好处。 1. **什么是PHP枚举(Enums)?** PHP枚举是类型安全的数据结构,允许我们定义一组相关的常量,它们的值在运行时...
也可以在同一行定义多个变量: ```cpp enum { pencil, pen } box, box2; ``` #### 显式指定枚举元素的值 如果需要为枚举元素指定具体的值,可以在定义时直接指定: ```cpp enum box { pencil = 1, pen = 2 }; ``...
然而,`Enum`的使用也需要遵循一定的原则和注意事项,避免过度复杂化枚举类型,保持代码的清晰度和可维护性。 总之,掌握`Enum`的用法及其高级技巧,对于提升代码质量和开发效率具有重要意义。在日常编程实践中,...
在上面的示例中,我们使用 enum 来定义一个 `Signal` 枚举类型,并在 `TrafficLight` 类中使用 switch 语句来处理不同的信号状态。 用法三:添加新方法 如果我们想要在 enum 中添加新的方法,那么必须在 enum 实例...
枚举(Enum)在Java中是一种特殊的类,用于定义固定的常量集合,它提供了一种安全、类型化的常量表示方式。以下是对Enum的详细讲解: 1. **基本枚举定义**: ```java enum Color {BLUE, RED, GREEN;} ``` 这是...
Java枚举类型(Enum)是Java SE ...理解并熟练使用枚举,能够使代码更加清晰、易读,同时避免了常量管理中的潜在问题。在实际开发中,尤其是在设计模式、状态机或者表示固定集合的场景下,枚举类型是非常有用的工具。
Laravel Enum库是为Laravel应用程序设计的一个扩展,它允许开发者使用枚举类型来替代传统的常量或字符串,从而使得业务逻辑更清晰,减少错误的可能性。下面将详细探讨Laravel Enum的使用、优点以及如何在项目中实现...
用于枚举磁盘设备的 Enumdisk 示例
### Java 枚举类型 enum 的使用详解 #### 一、枚举类型概述 在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来...
在前端开发中,枚举(Enum)是一种常用于定义固定集合的数据类型,它在很多编程语言中被广泛使用,但在JavaScript原生语法中并未直接支持。然而,由于开发者的需求,出现了一些开源库来模拟枚举的功能,比如"前端...
### Java中的Enum使用与分析 #### 一、概述 在Java编程语言中,`Enum`是一种特殊的数据类型,用于表示一组固定的常量值。通过枚举(`enum`),开发者可以更加直观地定义一系列预定义的值,并为这些值提供类型安全...
在这个场景中,我们关注的是一个名为"enum"的Python库,其版本为0.4.7,封装在"enum-0.4.7.tar.gz"的压缩包文件中。这个压缩包通常包含了库的所有源代码、文档和其他相关资源。 `enum`是Python中的一个内置库,自...
2. **使用String值传递**:除了ordinal,每个enum实例还有一个名称(即定义时的标识符)。可以将enum的名称作为String传递,然后在接收端通过反射机制创建对应的enum实例。 ```java public enum MyEnum { VALUE1(...
php-enum, PHP Enum实现灵感来自 SplEnum PHP enum 实现来自 SplEnum 为什么?首先,SplEnum 并不集成到PHP中,你必须单独安装它。使用 enum 而不是类常量提供了以下优点:你可以键入提示: function setAction(Ac