Рассмотрим замковое устройство доступа с 5 кнопками на нем, и 2-х номеров, относящихся к каждой кнопке:написание программы, которая печатает перестановкам
Пример:
Кнопка A: 1 2
Кнопка B: 3 4
Кнопка С: 5 6
Кнопка D: 7 8
Кнопка E: 9 0
Каждая кнопка имеет 2 возможных варианта; поэтому каждый 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 (pattern = 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 заявлений печати. Любая помощь приветствуется!
В C++ [очень легко получить перестановки] (http://en.cppreference.com/w/cpp/algorithm/next_permutation). –
Нет, все в порядке. Они читают 1 5-значный номер, затем разбивают его на 5 1-значный номер. Но это не удается, если число не 5 цифр. Если пользователь вводит 43, тогда массив будет содержать {0, 0, 0, 4, 3}. –
Он читает одно пятизначное число, а цикл for сразу же после разрыва чисел переводится в массив, который содержит каждый из этих 5 чисел. Код работает, я просто хочу знать лучший способ его улучшить. Это также предполагает, что пользователь вводит фактическое 5-значное число. –