C、C++、C# 或 Objective-C 中的排列

发布于 2024-12-07 23:26:25 字数 459 浏览 1 评论 0 原文

我正在尝试取一个数字并将其更改为这样的内容:

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

I am trying to take a number and change it to something like this:

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

etc…

So Using the Letters 'A','B','C'
And Using the Numbers 1,2,3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瀞厅☆埖开 2024-12-14 23:26:26

对于您的大多数输入,最左边的“数字”似乎变化最快,直到您达到 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时,它会失败。)

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

For most of your inputs, the left-most 'digits' appears to be changing fastest, until you get to 12->13 transition, where the middle digit changes slowest:

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

This is definitely awkward and will probably require a lot of extra effort to code than a scheme where the right-most or left-most digit changes fastest is strictly followed:

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

or

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

If you must follow exactly the scheme you've given here, then I'd recommend a lookup-table and simply hardcode this scheme into your source:

#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;
}

Please don't use this code directly -- I haven't done any input validation or array bounds checks.

Of course, I hope you pick a different approach entirely -- this simple codeword substitution works fine for a specific number of inputs, but some day someone might want to input a number greater than you've got in your table. (In this case, when someone wants to convert 19, it'll fail.)

A more generic approach, converting between bases, is an algorithm for converting between any two number bases. In your case, it could be converting into base 6 with the digits 1, 2, 3, A, B, C (if you strictly adhere to either a left-most changes fastest or right-most changes fastest approach).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文