这个问题是在我写个的几个博客里较为复杂的一个。首先,先看看整个问题的表述。

星号表示0~9的一个数字,而且不允许重复,使得下面的加法表达式成立。输出所有结果。

※ ※ ※ ※ ※ 
  +  2   0   0  8   5
————————
      ※ ※ ※ ※ ※

---------------------------------------------------分割线---------------------------------------------------------

对该问题进行分析(从简,自己在纸上画一画肯定能弄懂的):

用0~9  10个数字填入下列未知部分,不能重复使用,使等式成立
   
      a  b  c  d  e 
  +  2  0  0  8  5
———————
       f   g  h  i   j

-------------------------


分析:
a+2不能进位
b不能和g相等,故后面往前进了一位
c不能和h相等,故后面往前进了一位,因此,c为9,h为0.
d+8(+1)要进位,且i!=0,d为3,4,5,6,7,8
综上分析知:


      a    b    9   d   e 
  +  2    0    0   8   5
—————————
  a+2  b+1  0   i    j

------------------------------


9和0已经出现,所以
a为123456中一个
b为1234567中一个
d为345678中一个
e为123678中一个
i=(a+8)%10或(a+9)%10(进位)
j为678123中一个


根据循环即可求解。
求解过程中,注意e分为123,678两种进行循环
将数字分为两个数组,加式数组adder[5]和结果数组result[5]。
在循环中往里面加入数字,两个数组每个元素取出,连接成字符串,判断字符串数组中10个数字是否重复,如果不重复则是本题解,输出,否则继续循环。

上代码。

  1. package com.fuxuemingzhu.evaluated.main;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. /**
  5. * <p>
  6. * Title: Main
  7. * </p>
  8. * <p>
  9. * Description:计算0~9数字不重复使等式成立的排列
  10. * </p>
  11. *
  12. * @author fuxuemingzhu
  13. *
  14. * @email fuxuemingzhu@163.com
  15. *
  16. * @date 2014年11月24日 下午10:46:22
  17. */
  18. public class Main {
  19. /**
  20. * adder 加式因子
  21. */
  22. private static int[] adder = new int[5];
  23. /**
  24. * result 加式结果
  25. */
  26. private static int[] result = new int[5];
  27. /**
  28. * num 使等式成立的组数
  29. */
  30. private static int num = 0;
  31. /**
  32. * anserString 为了校验等式10个数是否重复设立的字符串
  33. */
  34. private static String anserString = new String();
  35. /**
  36. * charsCount 为了校验等式10个数是否重复设立的HashMap
  37. */
  38. public static HashMap<String, Integer> charsCount = new HashMap<String, Integer>();
  39. /**
  40. * <p>
  41. * Title: main
  42. * </p>
  43. * <p>
  44. * Description:main()方法
  45. * </p>
  46. *
  47. * @param args
  48. *
  49. */
  50. public static void main(String[] args) {
  51. cuculate();
  52. }
  53. /**
  54. * <p>
  55. * Title: cuculate
  56. * </p>
  57. * <p>
  58. * Description:利用循环计算出所有可能的结果
  59. * </p>
  60. *
  61. */
  62. public static void cuculate() {
  63. adder[2] = 9;
  64. result[2] = 0;
  65. for (int i = 1; i <= 6; i++) {
  66. adder[0] = i;
  67. result[0] = adder[0] + 2;
  68. for (int j = 1; j <= 7; j++) {
  69. adder[1] = j;
  70. result[1] = adder[1] + 1;
  71. for (int j2 = 3; j2 <= 8; j2++) {
  72. adder[3] = j2;
  73. for (int k = 1; k <= 3; k++) {
  74. result[3] = (adder[3] + 8) % 10;
  75. adder[4] = k;
  76. result[4] = adder[4] + 5;
  77. if (check()) {
  78. num++;
  79. output();
  80. }
  81. }
  82. for (int k = 6; k <= 8; k++) {
  83. result[3] = (adder[3] + 9) % 10;
  84. adder[4] = k;
  85. result[4] = (adder[4] + 5) % 10;
  86. if (check()) {
  87. num++;
  88. output();
  89. }
  90. }
  91. }
  92. }
  93. }
  94. }
  95. /**
  96. * <p>
  97. * Title: check
  98. * </p>
  99. * <p>
  100. * Description:判断是否满足10个数字不重复的条件
  101. * </p>
  102. *
  103. * @return
  104. *
  105. */
  106. public static boolean check() {
  107. anserString = new String();
  108. arrays2String();
  109. countWords();
  110. return checkMap();
  111. }
  112. /**
  113. * <p>
  114. * Title: arrays2String
  115. * </p>
  116. * <p>
  117. * Description:把数组转换成字符串,方便调用函数校验
  118. * </p>
  119. *
  120. */
  121. public static void arrays2String() {
  122. for (int i : adder) {
  123. anserString += i;
  124. }
  125. for (int i : result) {
  126. anserString += i;
  127. }
  128. }
  129. /**
  130. * <p>
  131. * Title: countWords
  132. * </p>
  133. * <p>
  134. * Description:用HashMap保存每个字符出现的次数
  135. * </p>
  136. *
  137. */
  138. public static void countWords() {
  139. charsCount = new HashMap<String, Integer>();
  140. for (int i = 0; i < anserString.length(); i++) {
  141. String temp = anserString.substring(i, i + 1);
  142. if (charsCount.containsKey(temp)) {
  143. charsCount.put(temp, charsCount.get(temp) + 1);
  144. } else {
  145. charsCount.put(temp, 1);
  146. }
  147. }
  148. }
  149. /**
  150. * <p>
  151. * Title: checkMap
  152. * </p>
  153. * <p>
  154. * Description:将HashMap中的每一个数字的出现次数进行判断,所有数字都出现1次,返回true,否则返回false
  155. * </p>
  156. *
  157. */
  158. public static boolean checkMap() {
  159. for (Iterator<String> iterator = charsCount.keySet().iterator(); iterator
  160. .hasNext();) {
  161. String words = (String) iterator.next();
  162. int num = charsCount.get(words);
  163. if (num > 1) {
  164. return false;
  165. }
  166. }
  167. return true;
  168. }
  169. /**
  170. * <p>
  171. * Title: output
  172. * </p>
  173. * <p>
  174. * Description:结果的输出
  175. * </p>
  176. *
  177. */
  178. public static void output() {
  179. System.out.println(" 这是第" + num + "组解:");
  180. String outputString = new String(" ");
  181. for (int i : adder) {
  182. outputString += i + " ";
  183. }
  184. System.out.println(outputString);
  185. System.out.println(" + 2 0 0 8 5\n—————————————");
  186. outputString = new String(" ");
  187. for (int i : result) {
  188. outputString += i + " ";
  189. }
  190. System.out.println(outputString);
  191. System.out.println("-------------------");
  192. }
  193. }

还需要解释一下其中识别0~9十个数字是否重复使用的解决方法。我是根据把数组里的元素转化成字符串,判断字符串是否有重复元素判断的,因为这个方法在我前面的博客里已经有使用,所以这里直接拿过来用了,图个方便。可参考我的另一篇博客:java源码——统计字符串中字符出现的次数

这里是程序运行时得到的本问题的所有解,共6组:

这是第1组解:
    1 4 9 8 2 
 + 2 0 0 8 5
——————
    3 5 0 6 7 
-------------------
 这是第2组解:
    2 7 9 5 1 
 + 2 0 0 8 5
———————
    4 8 0 3 6 
-------------------
 这是第3组解:
    3 7 9 4 1 
 + 2 0 0 8 5
———————
    5 8 0 2 6 
-------------------
 这是第4组解:
    4 1 9 7 3 
 + 2 0 0 8 5
———————
    6 2 0 5 8 
-------------------
 这是第5组解:
    5 1 9 6 3 
 + 2 0 0 8 5
———————
    7 2 0 4 8 
-------------------
 这是第6组解:
    6 4 9 3 2 
 + 2 0 0 8 5
———————
    8 5 0 1 7 
-------------------

附运行截图。

java源码——0~9十个数字不重复地使用使加法表达式成立的更多相关文章

  1. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  2. 如何阅读Java源码?

    阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...

  3. 24点扑克牌游戏——(含java源码)(GUI实现)

    给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...

  4. 从Java源码到Java字节码

    Java最主流的源码编译器,javac,基本上不对代码做优化,只会做少量由Java语言规范要求或推荐的优化:也不做任何混淆,包括名字混淆或控制流混淆这些都不做.这使得javac生成的代码能很好的维持与 ...

  5. Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址

     OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...

  6. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  7. Android反编译(一)之反编译JAVA源码

    Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具  dex2jar   http://code.go ...

  8. 如何阅读Java源码

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...

  9. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

随机推荐

  1. [Ocean Modelling for Begineers] Ch5. 2D Shallow-Water Modelling

    本章利用二维浅水模型研究表面重力波的不同物理过程,如湖水中风驱动流体,正压不稳定机制(?the barotropic instability mechanism).本章将为读者介绍使用不同的对流格式模 ...

  2. 论文解读(SDNE)《Structural Deep Network Embedding》

    论文题目:<Structural Deep Network Embedding>发表时间:  KDD 2016 论文作者:  Aditya Grover;Aditya Grover; Ju ...

  3. 『学了就忘』Linux文件系统管理 — 67、通过命令模式进行LVM分区

    目录 1.物理卷管理 (1)准备硬盘或者分区 (2)建立物理卷 (3)查看物理卷 (3)删除物理卷 2.创建卷组 (1)建立卷组 (2)查看卷组 (3)增加卷组容量 (4)减小卷组容量 (5)删除卷组 ...

  4. GO 总章

    GO 学习资源 go 代理 GO 语言结构 GO 数字运算 GO 时间处理 GO 定时器 GO 异常处理 go recover让崩溃的程序继续执行 GO Exit Fatal panic GO 通过进 ...

  5. Swift3.0 延时执行

    //延时1s执行 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(1*NSEC_PER_SEC))/ ...

  6. JConsole可视化工具

    JConsole基本介绍 Jconsole (Java Monitoring and Management Console),一种基于JMX的可视化监视.管理工具.JConsole 基本包括以下基本功 ...

  7. 【力扣】122. 买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  8. python使用gitlab-api

    目录 一.简介 二.示例 讲解 配置文件方式存储token 其它返回 三.其它操作 一.简介 公司使用gitlab 来托管代码,日常代码merge request以及其他管理是交给测试,鉴于操作需经常 ...

  9. JS 中常用的去重

    第一种:indexOf (获取字符串值在字符串中首次出现的位置,若没有这个值,则返回-1) let arr = [15,45,88,45,78,15,55,88]; let arr1 = []; // ...

  10. Java(运算符)

    运算符 Java语言支持的运算符: 算术运算符:+,-,*,/,%(取余.求余)[模运算],++(自增),--(自减) 赋值运算符:= 关系运算符:>,<,>=(大于等于),< ...