java源码——0~9十个数字不重复地使用使加法表达式成立
这个问题是在我写个的几个博客里较为复杂的一个。首先,先看看整个问题的表述。
星号表示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十个数字不重复地使用使加法表达式成立的更多相关文章
- 解密随机数生成器(二)——从java源码看线性同余算法
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...
- 如何阅读Java源码?
阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...
- 24点扑克牌游戏——(含java源码)(GUI实现)
给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...
- 从Java源码到Java字节码
Java最主流的源码编译器,javac,基本上不对代码做优化,只会做少量由Java语言规范要求或推荐的优化:也不做任何混淆,包括名字混淆或控制流混淆这些都不做.这使得javac生成的代码能很好的维持与 ...
- Tika结合Tesseract-OCR 实现光学汉字识别(简体、宋体的识别率百分之百)—附Java源码、测试数据和训练集下载地址
OCR(Optical character recognition) —— 光学字符识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向.可 ...
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
- Android反编译(一)之反编译JAVA源码
Android反编译(一) 之反编译JAVA源码 [目录] 1.工具 2.反编译步骤 3.实例 4.装X技巧 1.工具 1).dex反编译JAR工具 dex2jar http://code.go ...
- 如何阅读Java源码
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...
- Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库
http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...
随机推荐
- python-django-模板标签
注意:这个控制语句和python的差不多,但是记住必须有endfor 和endif 结尾 模板文件的django格式的注释是不会出现再网页渲染的源代码当中的 使用列子: <!DOCTYPE ht ...
- shell 脚本的基本定义
注意不能有控制,指令之间 [1]shell脚本的基础知识 (1)shell脚本的本质 编译型语言 解释型语言 shell脚本语言是解释型语言 shell脚本的本质 shell命令的有序集合 (2)sh ...
- 33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 & ...
- 计算机网络-4-7-内部网关协议OSPF
内部网关协议OSPF(开放最短路径优先) 出现的原因:为了克服RIP协议的缺点在1989年开发出来,**开放 表明OSPF协议不受任何厂家的限制.最短路径优先是因为使用了最短路径算法SPF**. OS ...
- 分布式事务(4)---最终一致性方案之TCC
分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(3)---强一致性分布式事务Atomikos实战 强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保 ...
- Spark(九)【RDD的分区和自定义Partitioner】
目录 spark的分区 一. Hash分区 二. Ranger分区 三. 自定义Partitioner 案例 spark的分区 Spark目前支持Hash分区和Range分区,用户也可以自定义分区 ...
- 颜色RGB值对照表
转载自 http://www.91dota.com/?p=49# 常用颜色的RGB值及中英文名称 颜 色 RGB值 英文名 中文名 #FFB6C1 LightPink 浅粉红 #F ...
- 【编程思想】【设计模式】【行为模式Behavioral】访问者模式Visitor
Python版 https://github.com/faif/python-patterns/blob/master/behavioral/visitor.py #!/usr/bin/env pyt ...
- OSGI与Spring结合开发web工程
简介: 作为一个新的事实上的工业标准,OSGi 已经受到了广泛的关注, 其面向服务(接口)的基本思想和动态模块部署的能力, 是企业级应用长期以来一直追求的目标.Spring 是一个著名的 轻量级 J2 ...
- Spring事务隔离级别和传播特性(转)
相信每个人都被问过无数次Spring声明式事务的隔离级别和传播机制吧!今天我也来说说这两个东西. 加入一个小插曲,一天电话里有人问我声明式事务隔离级别有哪几种,我就回答了7种,他问我Spring的版本 ...