【发布时间】:2015-05-07 22:47:53
【问题描述】:
亲爱的朋友们,我有一个任务,我几乎解决了它。但是我最近遇到了一个大问题,我两天都找不到出路。如果您能帮助我,我将不胜感激!
所以,假设用户输入了 5 (N) 我立即创建了这个序列以从中获取子集:{1,2,3,4,5}
如果 N = 4,则序列类似于:{1, 2, 3, 4} 等
下面的代码会生成所有类型的子集变体:
public static int[] genarator(int N)
{
int[] generator = new int[(int) Math.pow(2, N)];
int[] binDigit = new int[(int) Math.pow(2, N)];
for (int i = 0; i < Math.pow(2, N); i++)
generator[i] = (i >> 1) ^ i; // Right Shifting
for (int i = 0; i < Math.pow(2, N); i++)
{
int one = 1;
binDigit[i] = 0;
while (generator[i] > 0)
{
binDigit[i] += (generator[i] % 2) * one;
generator[i] /= 2;
one = one * 10;
}
}
return binDigit;
}
以及它返回结果的方式如下所示(在这种情况下:N = 4 {1, 2, 3, 4}):
1
1 2
2
2 3
1 2 3
1 3
3
3 4
1 3 4
1 2 3 4
2 3 4
2 4
1 2 4
1 4
4
但是我的讲师希望我的程序按此顺序返回结果:
1
2
3
4
1 2
1 3
1 4
2 3
2 4
3 4
1 2 3
1 2 4
1 3 4
2 3 4
1 2 3 4
我现在使用TreeSet<Long> 和parseLong,所以我可以得到真实的结果,直到 1
回顾一下,我的问题是如何存储我从int[] genarator(int N) 获得的那些数字并像我的讲师要求的那样显示它们?
生成器的工作原理以及如何以错误的顺序获取数字?代码如下:
int N = read.nextInt();
int[] sequence = new int[N];
for (int i = 0; i < N; i++)
sequence[i] = i + 1;
int[] tempArray = new int[(int) Math.pow(2, N)];
tempArray = genarator(N);
for (int i = 1; i < Math.pow(2, N); i++)
{
for (int j = 0; j < N; j++)
{
if (tempArray[i] % 10 == 1)
{
System.out.print(sequence[j] + " ");
}
tempArray[i] /= 10;
}
System.out.println();
}
感谢您的检查,对于这个太长的问题,我真的很抱歉。但我无法通过简短的解释来说明清楚。
【问题讨论】: