0-9这10个数字组成无重复的三个数字组合 本帖最后由 andy861025 于 2009-10-12 22:10:43 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 判断随即选出的三个数和前面是否相同就可以了 插入数据库用insert 其余楼主你会的吧 请楼主移步:Java中的排列组合问题(一) 有没有好的建议与想法呀!JAVA算法实现从000到999之间挑选出个十百三位不重复的数字就是个位,十位,百位,不能有重复。如:123,231,132,213,312,321 算为重复,只能取最小的123 这6个三位数只算为一个不重重复的三位数组合会有120*120*120种这组合会生成27个不重复的三位数字如:012/012/013 有:000 001 003 ..... 223 比对的话,有没有好的算法呢?这些大的组合下的三位数(000 001 003 ..... 223 )如何有效率的去与000-999这1000个三位数比与统计 贴一个求JAVA算法实现从000到999之间挑选出个十百三位不重复的数字的算法import java.util.List;/** * <pre> * 求m取n的所有组合。 * m个数分别为0,1,2...m-1. * 算法简述: * 二个组合,若仅有元素顺序不同,视其为同一个组合。 * 左位系低位,右位系高位。 * 按自然的取法取第一个组合(各数位分别是:0,1,2...n-1),以后的所有组合都经上一个组合变化而来: * 从右至左,找到有增量空间的位,将其加1,使高于该位的所有位,均比其左邻位大1,从而形成新的组合。 * 若所有位均无增量空间,说明所有组合均已被遍历。 * 使用该方法所生成的组合数中:对任意组合int[] c,下标小的数必定小于下标大的数. * </pre> */public class Combination { int n, m; int[] pre;// previous combination. public Combination(int n, int m) { this.n = n; this.m = m; } /** * 取下一个组合。可避免一次性返回所有的组合(数量巨大,浪费资源)。 if return null,所有组合均已取完。 */ public int[] next() { if (pre == null) {// 取第一个组合,以后的所有组合都经上一个组合变化而来。 pre = new int[n]; for (int i = 0; i < pre.length; i++) { pre[i] = i; } int[] ret = new int[n]; // 将 pre 数组复制到数组 ret 中 System.arraycopy(pre, 0, ret, 0, n); return ret; } int ni = n - 1, maxNi = m - 1; while (pre[ni] + 1 > maxNi) {// 从右至左,找到有增量空间的位。 ni--; maxNi--; if (ni < 0) return null;// 若未找到,说明了所有的组合均已取完。 } pre[ni]++; while (++ni < n) { pre[ni] = pre[ni - 1] + 1; } int[] ret = new int[n]; System.arraycopy(pre, 0, ret, 0, n); return ret; } /** * @param args */ public static void main(String[] args) { Combination c = new Combination(3, 10); int[] ret = new int[3]; int count = 0; while((ret=c.next())!=null) { for(int i : ret) System.out.print(i); System.out.println(); count ++; } System.out.println(count); }} java 打开 excel 2007 问题! 求解答,小女谢过!!! 问几个简单的语句~ 求一个字符串中中文的个数 初学者问题 Class<T>无法初始化,跪求高人解答 如何执行这样一个sql脚本~~~~~感谢~~~~ java udp通信求助 关于数组的问题 如何实现在一个程序中,通过不同的Class名称调用不同的Class。 如何在pb中录入word文档?????????????? proxool 出现的错误~求救... 分享紫光华语的笔试题(java部分),进来说说解题方案
JAVA算法实现从000到999之间挑选出个十百三位不重复的数字
就是个位,十位,百位,不能有重复。如:123,231,132,213,312,321 算为重复,只能取最小的123 这6个三位数只算为一个不重重复的三位数组合会有120*120*120种
这组合会生成27个不重复的三位数字
如:012/012/013
有:000 001 003 ..... 223 比对的话,有没有好的算法呢?
这些大的组合下的三位数(000 001 003 ..... 223 )如何有效率的去与000-999这1000个三位数比与统计
* <pre>
* 求m取n的所有组合。
* m个数分别为0,1,2...m-1.
* 算法简述:
* 二个组合,若仅有元素顺序不同,视其为同一个组合。
* 左位系低位,右位系高位。
* 按自然的取法取第一个组合(各数位分别是:0,1,2...n-1),以后的所有组合都经上一个组合变化而来:
* 从右至左,找到有增量空间的位,将其加1,使高于该位的所有位,均比其左邻位大1,从而形成新的组合。
* 若所有位均无增量空间,说明所有组合均已被遍历。
* 使用该方法所生成的组合数中:对任意组合int[] c,下标小的数必定小于下标大的数.
* </pre>
*/
public class Combination {
int n, m;
int[] pre;// previous combination. public Combination(int n, int m) {
this.n = n;
this.m = m;
} /**
* 取下一个组合。可避免一次性返回所有的组合(数量巨大,浪费资源)。 if return null,所有组合均已取完。
*/
public int[] next() {
if (pre == null) {// 取第一个组合,以后的所有组合都经上一个组合变化而来。
pre = new int[n];
for (int i = 0; i < pre.length; i++) {
pre[i] = i;
}
int[] ret = new int[n];
// 将 pre 数组复制到数组 ret 中
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
int ni = n - 1, maxNi = m - 1;
while (pre[ni] + 1 > maxNi) {// 从右至左,找到有增量空间的位。
ni--;
maxNi--;
if (ni < 0)
return null;// 若未找到,说明了所有的组合均已取完。
}
pre[ni]++;
while (++ni < n) {
pre[ni] = pre[ni - 1] + 1;
}
int[] ret = new int[n];
System.arraycopy(pre, 0, ret, 0, n);
return ret;
}
/**
* @param args
*/
public static void main(String[] args) {
Combination c = new Combination(3, 10);
int[] ret = new int[3];
int count = 0;
while((ret=c.next())!=null) {
for(int i : ret)
System.out.print(i);
System.out.println();
count ++;
}
System.out.println(count);
}
}