Консультация № 173546
22.10.2009, 12:40
0.00 руб.
0 1 1
Здравствуйте Уважаемые эксперты. Помогите пожалуйста переделать программу так, чтоб она выводила не сюръекции, а инъекции. Заранее благодарен.

Приложение:
#include <stdio.h>
#include <math.h>

int m, n, *pos;

void GetNext()
{
pos[m-1]++;
for (int i = m - 1; i > 0; i--)
if (pos[i] == n)
{
pos[i] = 0;
pos[i - 1]++;
}
}

bool IsSur()
{
int i;
bool *exist = new bool[n], ret = true;
for (i = 0; i < n; i++) exist[i] = false;
for (i = 0; i < m; i++) exist[pos[i]] = true;
for (i = 0; i < m; i++)
if (!exist[i])
{
ret = false;
break;
}
delete[] exist;
return ret;
}

main()
{
int i, nums = 0;
printf("Input m:"); scanf("%d", &m);
printf("Input n:"); scanf("%d", &n);
if (m < n)
{
printf("No Functions!\n");
return;
}
pos = new int[m];
for (i = 0; i < m; i++) pos[i] = 0;
int max = pow(n, m);
for (i = 0; i < max; i++)
{
if (IsSur())
{
for (int j = 0; j < m; j++)
printf("%d ", pos[j]);
printf("\n");
nums++;
}
GetNext();
}
printf("Funcs: %d\n", nums);
delete[] pos;
}

Обсуждение

Неизвестный
22.10.2009, 20:15
общий
это ответ
Здравствуйте, Мих@ил.

1. Проверка на инъекции - это проверка, что все pos[i] уникальны. Можно модифицировать Ваш метод IsSur(). Третий цикл не нужен, а во втором, перед тем как поставить exist[pos[i]] в true, проверить, что текущее значение false. Если текущее значение уже true, то вернуть false. Если мы успешно закончили цикл, то повторов нет и возвращаем true.

2. В Вашем коде IsSur() ошибка: третий цикл должен быть до n, а не до m.

3. Есть более эффективные способы как перебрать все сюръекции и все инзекции. Самое простое, что Вы можете легко сделать: если n>m, то можно сразу сказать, что нет инъекций, если m>n, то нет сюръекций.
5
Форма ответа