1-9自然数,可以组成3个3位数(数字不能重复使用),要求这三个三位数满足1:2:3,
写出实现逻辑和程序。
求代码!
这个有点意思
[code="java"] private static TreeSet set = new TreeSet();
/**
* @param args
*/
public static void main(String[] args) throws Exception {
int[] data = new int[]{1,2,3,4,5,6,7,8,9};
int[] used = new int[3];
for (int i=0; i<used.length; i++){
// 用 -1 来表示未使用
used[i] = -1;
}
// 计算排列数
calcPermutation(data, used, 0, 3);
//
int second = 0;
int third = 0;
for (Integer first : set){
second = first * 2;
third = first * 3;
if (set.contains(second) && set.contains(third)){
// 检查是否有重复数字
if (isUnique(first, second, third)){
System.out.println(first + ", " + second + ", " + third);
}
}
}
}
/**
* 计算排列数
* @param data 原始数组
* @param used 存储一组解的下标
* @param level 当前层次 [0, deep]
* @param deep 排列深度 [level, min(used.length, data.length)]
*/
public static void calcPermutation(int[] data, int[] used,
int level, int deep){
if (level == deep){
// 完成一组解
output(data, used);
return;
}
// 计算当前层的下一个可用值
int next = getNext(used, level, data.length);
while (next != -1){
// 为当前层赋值
used[level] = next;
// 处理下一层
calcPermutation(data, used, level + 1, deep);
// 回溯时将下一层还原
if (level + 1 < used.length){
used[level + 1] = -1;
}
next = getNext(used, level, data.length);
}
}
/**
* 获取下一个未使用的值
* @param used 存储一组解的下标
* @param level 当前层次 [0, used.length)
* @param length
* @return
*/
private static int getNext(int[] used, int level, int length) {
int result = -1;
for (int i=used[level] + 1; i<length; i++){
// 标记当前下标是否已经使用过
boolean available = true;
for (int j=0; j<=level; j++){
if (i == used[j]){
available = false;
break;
}
}
if (available){
result = i;
break;
}
}
return result;
}
/**
* 输出一组解
* @param data
* @param used
*/
private static void output(int[] data, int[] used) {
int result = 0;
for (byte i=0; i<used.length; i++){
result = result * 10 + data[used[i]];
}
set.add(result);
}
/**
* 判断数字是否唯一
* @param args
* @return
*/
private static boolean isUnique(int... args){
Set<Integer> tmp = new HashSet<Integer>();
for (int arg : args){
int first = arg / 100;
arg = arg%100;
int second = arg / 10;
int third = arg%10;
if (tmp.contains(first) || tmp.contains(second)
|| tmp.contains(third)){
return false;
}
tmp.add(first);
tmp.add(second);
tmp.add(third);
}
return true;
}[/code]
// 输出
[code="html"]192, 384, 576
219, 438, 657
273, 546, 819
327, 654, 981[/code]
这个,数据量又不大,把1:2:3的数据全查出来,再判断是否重复不就行了。又不难。
基数最小为123,最大为987,而最大的3的倍数的数就是987,即基数为329的时候,所以要循环123->329,每次得到3个数,然后检验3个数是否有重复数字。
[code="java"]
class Test4Main {
public static void main(String[] args) {
int n1 = 0;
int n2 = 0;
for (int i = 123; i <= 987; i++) {
n1 = i * 2;
n2 = i * 3;
if (isOk(n1, i) && isOk(n2, i)) {
System.out.println("i:" + i + " n1:" + n1 + " n2:" + n2);
break;
}
}
}
/**
* 检查两个数是否包含相同的数
* @param int1
* @param int2
* @return
*/
private static boolean isOk(int int1, int int2) {
String s1 = String.valueOf(int1);
String s2 = String.valueOf(int2);
for (int i = 0; i < s1.length(); i++) {
if (s2.indexOf(s1.indexOf(i)) >= 0) {
return false;
}
}
return true;
}
}
[/code]
帮你写下~~~~~~~~~~
明显有bug,比较了1和2,比较了1和3,没比较2和3
楼主意思是说三位数自己的数字不能重复还是要求三个三位数他们之间的数字都不能重复啊?楼上大哥算出来的123 246 369.,跟我目测的结果一样,但是不知道符合要求不?呵呵
[code="java"] /**
* @param args
*/
public static void main(String[] args) throws Exception {
for (int i=100; i<999; i++){
int first = i;
int second = first * 2;
int third = first * 3;
// 检查是否有重复数字
if (third < 1000 && isUnique(first, second, third)){
System.out.println(first + ", " + second + ", " + third);
}
}
}
/**
* 判断数字是否唯一
* @param args
* @return
*/
private static boolean isUnique(int... args){
int[] flags = new int[10];
for (int arg : args){
int first = arg/100;
arg = arg%100;
int second = arg/10;
int third = arg%10;
if (flags[first] == first){
return false;
}
flags[first] = first;
if (flags[second] == second){
return false;
}
flags[second] = second;
if (flags[third] == third){
return false;
}
flags[third] = third;
}
return true;
}[/code]