C,C ++,C#或Objective-C中的置换

时间:2011-10-03 15:28:35

标签: recursion permutation

我正在尝试取一个数字并将其更改为:

Number  Change To       
1       0001A       
2       0002A
3       0003A
4       0001B
5       0002B       
6       0003B
7       0001C
8       0002C
9       0003C       
10      0001AA
11      0002AA
12      0003AA
13      0001AB
14      0002AB
15      0003AB
10      0001AC
11      0002AC
12      0003AC
13      0001BA
14      0002BA
15      0003BA

等...

所以使用字母'A','B','C' 并使用数字1,2,3

1 个答案:

答案 0 :(得分:0)

对于大多数输入,最左边的“数字”似乎变化最快,直到你进入12-> 13过渡,其中中间数字变化最慢:

1A
2A
3A
...
2AA
3AA
1AB
2AB
...

这绝对是尴尬的,并且可能需要花费大量额外的代码来进行编码,而不是最严格遵循最右边或最左边数字变化的方案:

1A
2A
3A
...
2AA
3AA
1BA
2BA
...

1
2
3
a
b
c
11
12
13
1a
1b
1c
21
22
23
...

如果您必须完全遵循此处给出的方案,那么我建议使用查找表,只需将此方案硬编码到您的源代码中:

#include <stdio.h>

int main(int argc, char* argv[]) {
    char table[][5]={"ZERO", "1A", "2A", "3A", "1B", "2B", "3B", "1C", "2C", "3C",
                            "1AA", "2AA", "3AA", "1AB", "2AB", "3AB", "1AC", "2AC", "3AC"};
    int i;
    for (i=1; i<argc; i++) {
        int input=atoi(argv[i]);
        printf("%d\t%s\n", input, table[input]);
    }
    return 0;
}

请不要直接使用此代码 - 我还没有完成任何输入验证或数组边界检查。

当然,我希望你完全选择一种不同的方法 - 这种简单的代码字替换适用于特定数量的输入,但有一天有人可能想输入一个比你表中更大的数字。 (在这种情况下,当有人想转换19时,它就会失败。)

更通用的方法converting between bases是一种用于在任意两个数字基数之间进行转换的算法。在您的情况下, 可以转换为基数6,数字为123ABC(如果您严格遵守最左侧更改或最右侧更改最快的方法)。