很具挑战性的一组数字循环输出问题

chen376663811 2010-03-26 04:47:16
有一组8位数的数字,其中的数字在3-8之间,就是说这组数字只包括(3、4、5、6、7、8);怎么循环输出它产生的所有数组。
...全文
304 22 打赏 收藏 转发到动态 举报
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
KingWolfOfSky 2010-03-30
  • 打赏
  • 举报
回复

public static void main(String args[]) {
for (int i1 = 3; i1 < 9; i1++) {
for (int i2 = 3; i2 < 9; i2++) {
for (int i3 = 3; i3 < 9; i3++) {
for (int i4 = 3; i4 < 9; i4++) {
for (int i5 = 3; i5 < 9; i5++) {
for (int i6 = 3; i6 < 9; i6++) {
for (int i7 = 3; i7 < 9; i7++) {
for (int i8 = 3; i8 < 9; i8++) {
System.out.println("" + i1 + i2 + i3
+ i4 + i5 + i6 + i7 + i8);
}
}
}
}
}
}
}
}
}
KingWolfOfSky 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 bawgiitx 的回复:]
Java code

public static void main(String[] args) throws MalformedURLException, IOException {
int[] key = {3,4,5,6,7,8};
int[][] bb = allOrder(key);
//显示结果
Sy……
[/Quote]
有一组8位数的数字,其中的数字在3-8之间,就是说这组数字只包括(3、4、5、6、7、8);怎么循环输出它产生的所有数组。
keeya0416 2010-03-30
  • 打赏
  • 举报
回复
if(start > head)
要改成 if(start > head - 1)
忘了这个 要不当前题目中就少算了一个 33333333
keeya0416 2010-03-30
  • 打赏
  • 举报
回复
我又优化了下 上边那个getNumsbit(start) == length总是调用算位数,很浪费时间

public class Test {
public static void main(String[] args) {
SelectTheNum(3,8,8);
}
private static void Select(int start, int min, int max, int length, int head){
if(start > head){
System.out.println(start);
return;
}
for(int m = min; m <= max; m++){
Select( start*10 + m, min, max, length, head);
}
}
public static void SelectTheNum(int min, int max, int length){
//参数min,max为要用到的数字的区间,length为要生成的数字的位数;
int head = 0;
while(length > 0){
head = head*10 + min;
length--;
}
Select(0,min,max,length,head);
}
}

这个效率要比我上边写的高一点点 呵呵
毕竟那个总是调一个方法算数字位数够没,太繁琐了
tonytone2008 2010-03-30
  • 打赏
  • 举报
回复
恩,用递归貌似很简单样
keeya0416 2010-03-30
  • 打赏
  • 举报
回复
刚才代码写错了搞的溢出,还以为是数字太大了呢
发上我的 欢迎批评

public class Test {
public static void main(String[] args) {
SelectTheNum(3,8,8);
}


private static int getNumsbit(int i){
int temp = 0;
while(i > 0){
i /= 10;
temp++;
}
return temp;
}
private static void Select(int start, int min, int max, int length){
if(getNumsbit(start) == length){
System.out.println(start);
return;
}
for(int m = min; m <= max; m++){
Select( start*10 + m, min, max, length);
}
}
public static void SelectTheNum(int min, int max, int length){
//参数min,max为要用到的数字的区间,length为要生成的数字的位数;
Select(0,min,max,length);
}
}

这个可以传参指定2个数字的区间,还可以指定数字的长度。
keeya0416 2010-03-30
  • 打赏
  • 举报
回复
2楼的方法不错;判断的时候有点影响效率
但是想提高点效率用DP的话 又会栈溢出
Ark032425 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dazzlingwinter 的回复:]
Java code

public class MatchTest {
public static void main(String[] args) {
String str = null;
int count=0;
for(int i=33333333; i<=88888888; i++) {
str ……
[/Quote]
方法很多;还是这种比较快捷方便
zi2xuan 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kingwolfofsky 的回复:]
Java code

public static void main(String args[]) {
for (int i1 = 3; i1 < 9; i1++) {
for (int i2 = 3; i2 < 9; i2++) {
for (int i3 = 3; i3 < 9; i3++) {
……
[/Quote]
一般的机器受捕鸟!
musiclee 2010-03-30
  • 打赏
  • 举报
回复
恩 很简单!
bawgiitx 2010-03-30
  • 打赏
  • 举报
回复
run:
用时:1734ms,一共:1679616个
bawgiitx 2010-03-30
  • 打赏
  • 举报
回复

//上面 int [][] 改用 short[][] 速度更快,short16位char16位,key可表示字符不受影响

bawgiitx 2010-03-30
  • 打赏
  • 举报
回复
没必要用递归,下百是模块化的,也用不也了多久,全是打印花时间


public static void main(String[] args) throws MalformedURLException, IOException {
int[] key = {3, 4, 5, 6, 7, 8};
long time = System.currentTimeMillis();
int[][] tem = print(key, 8);
System.out.println("用时:"+(System.currentTimeMillis()-time)+"ms,一共:"+tem.length+"个");

/// 显示 start
int ttt = 1;
for (int i = 0; i < tem.length; i++) {
System.out.print(""+ttt+++":");//计数
for(int j=0;j<8;j++){
System.out.print(key[tem[i][j]]);
}
System.out.println();
}
/// 显示 end
}

/**
* 以key为关键字可重复的bit位数位的全排列
* @param key 显示的关键字
* @param bit 位数
*/
static int[][] print(int key[], int bit) {
int kl = key.length;
int Max = (int) Math.pow(kl, bit);
int[][] tem = new int[Max][bit];
for (int count = 0, j, b; count < Max; count++) {
for (j = bit - 1, b = count; j > -1; j--) {
tem[count][j] = b % kl;
b /= kl;
}
}
return tem;
}
/*run:
用时:2125ms,一共:1679616个
1:33333333
2:33333334
3:33333335
*/
bawgiitx 2010-03-29
  • 打赏
  • 举报
回复

public static void main(String[] args) throws MalformedURLException, IOException {
int[] key = {3,4,5,6,7,8};
int[][] bb = allOrder(key);
//显示结果
System.out.println("一共:"+bb.length+"个");
for (int[] s : bb) {
for (int i = 0; i < s.length; i++) {
System.out.print(s[i]);
if (i < s.length - 1) {
System.out.print(",");
}
}
System.out.println();
}
}

/**对key全排列
*/
static int[][] allOrder(final int[] key) {
java.util.LinkedList<int[]> list = new java.util.LinkedList<int[]>();
int length = key.length;
int[] itgr = new int[length];
System.arraycopy(key, 0, itgr, 0, length);
list.add(itgr);
for (int loop = 1; loop < length; loop++) {
int[][] tem = list.toArray(new int[list.size()][]);
for (int loop1 = 0; loop1 < loop; loop1++) {
for (int[] bft : tem) {
int[] itg = new int[length];
System.arraycopy(bft, 0, itg, 0, length);
int sw = itg[loop];
itg[loop] = itg[loop1];
itg[loop1] = sw;
list.add(itg);
}
}
}
return list.toArray(new int[list.size()][length]);
}


run:
一共:720个
3,4,5,6,7,8
4,3,5,6,7,8
5,4,3,6,7,8
5,3,4,6,7,8
3,5,4,6,7,8
4,5,3,6,7,8
6,4,5,3,7,8
6,3,5,4,7,8
6,4,3,5,7,8
--------
小余 2010-03-29
  • 打赏
  • 举报
回复
冬子哥 经常看到你啊
你真是我的偶像
shan1119 2010-03-27
  • 打赏
  • 举报
回复
欢迎批评指正
loop(0,1);
private static int cs=0;
public static void loop(int v, int l){
for(int i=8;i>=3;i--){
if((v+i*l)/10000000>0){
cs++;
// System.out.print(cs+":"+(v+i*l)+"\t\t");
// if(cs%10==0)System.out.println();
}else
loop(v+i*l,l*10);
}
}
hepeng_8 2010-03-27
  • 打赏
  • 举报
回复
loop(0,1);
private static int cs=0;
public static void loop(int v, int l){
for(int i=8;i>=3;i--){
if((v+i*l)/10000000>0){
cs++;
// System.out.print(cs+":"+(v+i*l)+"\t\t");
// if(cs%10==0)System.out.println();
}else
loop(v+i*l,l*10);
}
}


递归就是最好的方法啊
shan1119 2010-03-26
  • 打赏
  • 举报
回复
我也写一个,等高人出好的

int count=0;
for(int i=33333333; i<=88888888; i++) {
if(i/10000000>=3 && i/10000000<=8 &&
i%10000000/1000000>=3 && i%10000000/1000000<=8 &&
i%1000000/100000>=3 && i%1000000/100000<=8 &&
i%100000/10000>=3 && i%100000/10000<=8 &&
i%10000/1000>=3 && i%10000/1000<=8 &&
i%1000/100>=3 && i%1000/100<=8 &&
i%100/10>=3 && i%100/10<=8 ){
count++;
System.out.print(count + ":" + i + "\t\t");
if(count%10==0)System.out.println();
}
}
SS_YI123 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dazzlingwinter 的回复:]

Java code

public class MatchTest {
public static void main(String[] args) {
String str = null;
int count=0;
for(int i=33333333; i<=88888888; i++) {
str = Str……
[/Quote]

哈哈,又是这位哥们,用正则表达式用得挺熟练的,佩服佩服~
24K純帥 2010-03-26
  • 打赏
  • 举报
回复
全排列,用递归解决~
加载更多回复(2)
相关推荐

62,568

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告