考虑一个带有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个打印语句。任何帮助表示赞赏!
答案 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
并编写自己的位转换例程。