我想将HandleMessage
和0
之间的所有可能的数字赋值到n-1
变量中。我知道,有v
这样的分配,因此我从一个循环开始,该循环生成数字v^n
。如何将枚举数从循环转换为实际分配?我对0..(v^n)-1
和n=4
的情况特别感兴趣。
v=7
for (int i = 0; i < Math.pow(v, n); ++i) {
variable0 = ...;
variable1 = ...;
variable2 = ...;
...
variable6 = ...;
}
我的目标是为每个输入分配一个方法,并为所有输入获取所有可能的方法组合。
下面是代码(在from this solution的帮助下)
i variable
0 1 2 3 4 5 6
---------------------------
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1
2 0 0 0 0 0 0 2
3 0 0 0 0 0 0 3
4 0 0 0 0 0 1 0
...
12000 2 3 2 3 2 0 0
...
16383 3 3 3 3 3 3 3
根据以上代码,共有3种方法(功能A,B,C)和2种输入(名称,电话号码)。因此,所有组合的可能性为3 ^ 2 = 9。 因此,输出如下。
public static final int FUNCTION_NUMBER = 3;
public static String functionA() {
return "A";
}
public static String functionB() {
return "B";
}
public static String functionC() {
return "C";
}
public static String callFunction(int function_index) {
switch (function_index) {
case 0:
return functionA();
case 1:
return functionB();
case 2:
return functionC();
default:
throw new IllegalArgumentException("Incorrect value for function_index");
}
}
public static void main(String[] args) {
for (int i = 0; i <= 8; i++) {
int name_function_index = i / FUNCTION_NUMBER;
int phone_no_function_index = i % FUNCTION_NUMBER; }
我的问题是,如果我有4种方法(功能A,B,C,D)和7种输入(名字,姓氏,电话号码,办公室号码,添加,街道,国家/地区)怎么办?因此,组合将为4 ^ 7 =16384。为了获得如下所示的所有可能组合,输入的公式是什么?
loop name phoneno
0 A A
1 A B
2 A C
3 B A
4 B B
5 B C
6 C A
7 C B
8 C C
任何帮助将不胜感激!
答案 0 :(得分:1)
当您拥有 v 变量 var 0 到 var v-1 并要为它们分配 0 和 n-1 之间的数字,可以将枚举数 i 转换为基数 n ,然后为每个变量选择一位数字。
您有 v = 3 个变量和n = 2个数字。您知道存在 v n 个可能的分配,并使用计数器 i 进行枚举。通常,人类以小数(以10为底)计数,但是这次,我们以二进制(以2为底)计数。
null
i 二进制表示形式的三位数直接对应于 i 枚举的变量赋值。
要获得分配,我们从基 n 中提取了 i 的 v 位。
假设您有10个基数(正常/十进制) i = 3149 ,并且想要提取其四位数。你会做的
i | Assignment
dec bin | var2 var1 var0
----------+----------------
0 000 | 0 0 0
1 001 | 0 0 0
2 010 | 0 1 0
3 011 | 0 1 1
4 100 | 1 0 0
5 101 | 1 0 1
6 110 | 1 1 0
7 111 | 1 1 1
第 x 位数字的公式为 i / 10 x %10 。 现在,如果基数 n 不同于10,则公式将为 i / n x %n 。
一个用于 v = 3 和 n = 4 的小示例程序:
digit0 = i % 10; // same as i / 1 % 10
digit1 = i / 10 % 10;
digit2 = i / 100 % 10;
digit3 = i / 1000 % 10;
打印
int var0, var1, var2;
int n = 4;
System.out.println(" i | Assignment");
System.out.println("-----+-----------");
for (int i = 0; i < Math.pow(n, 3); ++i) {
var0 = i % n; // = i / Math.pow(n, 0) % n
var1 = i / n % n; // = i / Math.pow(n, 1) % n
var2 = i / (n * n) % n; // = i / Math.pow(n, 2) % n
System.out.format("%4d | %2d %2d %2d\n", i, var2, var1, var0);
}
对于更短,更干净,更可扩展的程序,您不应该编写
之类的东西。 i | Assignment
-----+-----------
0 | 0 0 0
1 | 0 0 1
2 | 0 0 2
3 | 0 0 3
4 | 0 1 0
.
.
.
61 | 3 3 1
62 | 3 3 2
63 | 3 3 3
手动。使用数组和循环。