Корректный перевод с плюсов на си
#include <iostream>
using namespace std;
void swap(int *a, int i, int j)
{
int s = a[i];
a[i] = a[j];
a[j] = s;
}
bool NextSet(int *a, int n, int m)
{
int j;
do // повторяем пока не будет найдено следующее размещение
{
j = n - 1;
while (j != -1 && a[j] >= a[j + 1]) j--;
if (j == -1)
return false; // больше размещений нет
int k = n - 1;
while (a[j] >= a[k]) k--;
swap(a, j, k);
int l = j + 1, r = n - 1; // сортируем оставшуюся часть последовательности
while (l < r)
swap(a, l++, r--);
} while (j > m - 1);
return true;
}
void Print(int *a, int n) // вывод размещения
{
static int num = 1; // номер размещения
cout.width(3); // ширина поля вывода номера размещения
cout << num++ << ": ";
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
int main()
{
int n, m, *a;
cout << "N = ";
cin >> n;
cout << "M = ";
cin >> m;
a = new int[n];
for (int i = 0; i < n; i++)
a[i] = i + 1;
Print(a, m);
while (NextSet(a, n, m))
Print(a, m);
cin.get(); cin.get();
return 0;
}
Это С++ код, а вот то, что я попытался сделать, но где-то прокололся и теперь не работает так как надо:
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>
#include<malloc.h>
#pragma warning(disable : 4996)
void swap(int *a, int i, int j)
{
int s = a[i];
a[i] = a[j];
a[j] = s;
}
bool Next(int *a, int n, int m)
{
int j=0;
do
{
int j = n - 2;
while (j != -1 && a[j] >= a[j + 1]) j--;
if (j == -1)
return false;
int k = n - 1;
while (a[j] >= a[k])k--;
swap(a, j, k);
int l = j + 1, r = n - 1;
while (l < r)
swap(a, l++, r--);
} while (j > m - 1);
return true;
}
void Print(int *a, int n)
{
int num = 1;
printf("%3d: ", num++);
for (int i = 0; i < n; i++)
{
printf("%d", a[i]);
printf("\n");
}
}
int main()
{
int n, m, *a;
printf("N= ");
scanf("%d", &n);
printf("M= ");
scanf("%d", &m);
a = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
Print(a, m);
while (Next(a, n, m))
Print(a, m);
}
free(a);
system("pause");
return 0;
}
Смысл программы состоит в том, чтобы показать все возможные размещения из n по k элементов, но мой перевод превратил все в бесконечный цикл, вопрос:"Как исправить?"
Вот результат вывода программы на плюсах:

А это, то, что я сделяль:
Ответы (1 шт):
Автор решения: Qwertiy
→ Ссылка
PS: Что-то весь вопрос на троллинг смазивает. Ну как первое можно было сделать случайно? А если и можно, то в diff'е же сразу видно косяк.


