编写打印出排列的程序

时间:2015-04-26 17:57:14

标签: c arrays combinations permutation

考虑一个带有5个按钮的按键访问设备,以及与每个按钮相关的2个数字:

示例:

按钮A:1 2

按钮B:3 4

按钮C:5 6

按钮D:7 8

按钮E:9 0

每个按钮有两种可能的选择;因此,每个5位数的访问代码有2 ^ 5 = 32种组合。

例如:

代码1 3 5 7 9将使用与代码2 4 6 8 0(模式= ABCDE)相同的按钮模式输入

代码1 4 4 4 1将使用与代码1 3 3 3 2(模式= ABBBA)相同的按钮模式输入

在提示用户输入访问代码并检查其是否在范围内(0 - 99999)之后,计算并在屏幕上打印32个不同的代码。

我能够编写这个程序,但它是使用我的代码中显示的32个打印语句完成的:

#include <stdio.h>
#define MAXNUM 5
#define COMBO 32

int main(){

    int input;
    int num[MAXNUM];
    int numtemp[MAXNUM];
    int i;

    printf("Please enter your 5 numbers within the range of [0~99999]:\n");
    scanf("%d", &input);
    while(input > 99999 || input < 0){
        printf("The inputted number is not in the specified range[0~99999], Please enter a new number:\n");
        scanf("%d", &input);
    }//end while

    for(i = 4; i >= 0; --i){
        num[i] = input%10;  
        input /= 10;
    }//set num array to each digit of inputted number

    for(i = 0; i < MAXNUM; ++i){
        switch(num[i]){
            case 1:
              numtemp[i] = 2;
              break;
            case 2:
              numtemp[i] = 1;
              break;
            case 3:
              numtemp[i] = 4;
              break;
            case 4:
              numtemp[i] = 3;
              break;
            case 5:
              numtemp[i] = 6;
              break;
            case 6:
              numtemp[i] = 5;
              break;
            case 7:
              numtemp[i] = 8;
              break;
            case 8:
              numtemp[i] = 7;
              break;
            case 9:
              numtemp[i] = 0;
              break;
            case 0:
              numtemp[i] = 9;
              break;
        }//end switch
    }//array numtemp now has all opposite values of array num

    //32 print statements for the different combinations
    printf("Here are your 32 combinations:\n");
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], num[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], numtemp[3], num[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], num[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], num[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], num[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], num[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], num[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], num[1], numtemp[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], num[1], numtemp[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", num[0], numtemp[1], numtemp[2], numtemp[3], numtemp[4]);
    printf("%d%d%d%d%d\n", numtemp[0], numtemp[1], numtemp[2], numtemp[3], numtemp[4]);
}//end of main

numtemp包含num的所有相反值,并以这种方式打印了32种组合。我想知道是否有人能提出更简单的解决方案。这是一个实验室作业,我得到了充分的信任,但我想改进代码,因此它没有那32个打印语句。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

如果要显示所有可能的代码,则可以使用0到32之间所有数字的二进制表示(对此使用c()),然后显示每个相应的位,如下所示:

std::bitset

如果使用C,则将#include <iostream> #include <bitset> #include <string> int main() { const std::string letter{"ABCDE"}; for(std::size_t i = 0; i < 32; ++i) { for(std::size_t j = 0; j < 5; ++j) { std::cout << letter[j] << std::bitset<5>(i)[j] << " "; } std::cout << std::endl; } } 替换为std::string并编写自己的位转换例程。