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

星号表示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个数字是否重复,如果不重复则是本题解,输出,否则继续循环。

上代码。

package com.fuxuemingzhu.evaluated.main;

import java.util.HashMap;
import java.util.Iterator; /**
* <p>
* Title: Main
* </p>
* <p>
* Description:计算0~9数字不重复使等式成立的排列
* </p>
*
* @author fuxuemingzhu
*
* @email fuxuemingzhu@163.com
*
* @date 2014年11月24日 下午10:46:22
*/
public class Main { /**
* adder 加式因子
*/
private static int[] adder = new int[5]; /**
* result 加式结果
*/
private static int[] result = new int[5]; /**
* num 使等式成立的组数
*/
private static int num = 0; /**
* anserString 为了校验等式10个数是否重复设立的字符串
*/
private static String anserString = new String(); /**
* charsCount 为了校验等式10个数是否重复设立的HashMap
*/
public static HashMap<String, Integer> charsCount = new HashMap<String, Integer>(); /**
* <p>
* Title: main
* </p>
* <p>
* Description:main()方法
* </p>
*
* @param args
*
*/
public static void main(String[] args) {
cuculate();
} /**
* <p>
* Title: cuculate
* </p>
* <p>
* Description:利用循环计算出所有可能的结果
* </p>
*
*/
public static void cuculate() {
adder[2] = 9;
result[2] = 0; for (int i = 1; i <= 6; i++) {
adder[0] = i;
result[0] = adder[0] + 2; for (int j = 1; j <= 7; j++) {
adder[1] = j;
result[1] = adder[1] + 1; for (int j2 = 3; j2 <= 8; j2++) {
adder[3] = j2; for (int k = 1; k <= 3; k++) {
result[3] = (adder[3] + 8) % 10;
adder[4] = k;
result[4] = adder[4] + 5;
if (check()) {
num++;
output();
}
}
for (int k = 6; k <= 8; k++) {
result[3] = (adder[3] + 9) % 10;
adder[4] = k;
result[4] = (adder[4] + 5) % 10;
if (check()) {
num++;
output();
}
}
}
}
}
} /**
* <p>
* Title: check
* </p>
* <p>
* Description:判断是否满足10个数字不重复的条件
* </p>
*
* @return
*
*/
public static boolean check() {
anserString = new String();
arrays2String();
countWords();
return checkMap(); } /**
* <p>
* Title: arrays2String
* </p>
* <p>
* Description:把数组转换成字符串,方便调用函数校验
* </p>
*
*/
public static void arrays2String() {
for (int i : adder) {
anserString += i;
}
for (int i : result) {
anserString += i;
}
} /**
* <p>
* Title: countWords
* </p>
* <p>
* Description:用HashMap保存每个字符出现的次数
* </p>
*
*/
public static void countWords() {
charsCount = new HashMap<String, Integer>();
for (int i = 0; i < anserString.length(); i++) {
String temp = anserString.substring(i, i + 1);
if (charsCount.containsKey(temp)) {
charsCount.put(temp, charsCount.get(temp) + 1);
} else {
charsCount.put(temp, 1);
}
}
} /**
* <p>
* Title: checkMap
* </p>
* <p>
* Description:将HashMap中的每一个数字的出现次数进行判断,所有数字都出现1次,返回true,否则返回false
* </p>
*
*/
public static boolean checkMap() {
for (Iterator<String> iterator = charsCount.keySet().iterator(); iterator
.hasNext();) {
String words = (String) iterator.next();
int num = charsCount.get(words);
if (num > 1) {
return false;
}
}
return true; } /**
* <p>
* Title: output
* </p>
* <p>
* Description:结果的输出
* </p>
*
*/
public static void output() {
System.out.println(" 这是第" + num + "组解:");
String outputString = new String(" ");
for (int i : adder) {
outputString += i + " ";
}
System.out.println(outputString);
System.out.println(" + 2 0 0 8 5\n—————————————");
outputString = new String(" ");
for (int i : result) {
outputString += i + " ";
}
System.out.println(outputString);
System.out.println("-------------------");
}
}

还需要解释一下其中识别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. Ubuntu 彻底卸载 MySQL 数据库

    Ubuntu 18.04 彻底卸载MySQL 5.7.31 1. 查看MySQL的依赖项 dpkg --list|grep mysql 2. 卸载 mysql-common sudo apt remo ...

  2. python-django-聚合与统计

    l例子1: 这里的values_list 相当于SQL语句里面的GROUP BY的功能,但是返回的是一个元组 要实现示例当中的直接用,与数据库格式有关将模型设计得更加完美 模型: 注意related_ ...

  3. Python Cheatsheet

    Comprehensive Python Cheatsheet Download text file, Buy PDF, Fork me on GitHub or Check out FAQ. Con ...

  4. open 函数小结

    umask 掩码 open 函数的时候需要注意,掩码去反之后和设置的值想与,得到真正的值. 可以在命令行 使用umask 来查询 umask 000 设置掩码

  5. 前端1 — HTML — 更新完毕

    1.首先来了解一个东西 -- W3C标准( 全称是:World Wide Web Consortium ) 万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合 -- 这个其实每天都 ...

  6. OAuth2.0实战!使用JWT令牌认证!

    大家好,我是不才陈某~ 这是<Spring Security 进阶>的第3篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...

  7. Hadoop入门 集群常用知识与常用脚本总结

    目录 集群常用知识与常用脚本总结 集群启动/停止方式 1 各个模块分开启动/停止(常用) 2 各个服务组件逐一启动/停止 编写Hadoop集群常用脚本 1 Hadoop集群启停脚本myhadoop.s ...

  8. 论 Erda 的安全之道

    作者|陈建锋 来源|尔达 Erda 公众号 ​ 软件研发是一个复杂的工程,不仅需要进行软件的设计.开发.测试.运维,还涉及到大量的人力.物力管理.今天讨论的主角 - "安全",在软 ...

  9. ps精修

    1.磨皮方法: a,, 添加高斯模糊后,按住alt键新建图层蒙版,设置前景色为白色,用画笔在脸上雀斑的位置涂抹,注意脸轮廓位置不要涂抹.最后添加曲线提亮 b. 添加蒙尘和划痕后,后面上面的一样

  10. Templates and Static variables in C++

    Function templates and static variables: Each instantiation of function template has its own copy of ...