21.05.2020, 04:21
|
Новичок на форуме
|
|
Регистрация: 20.05.2020
Сообщений: 6
|
|
Помогите перевести код с с++ на js
Здравствуйте есть код на c++ не знаю как перевести его в Javascript нужно чтобы N передавалось из html
Код:
|
#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 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--);
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, *a;
cout << "N = ";
cin >> n;
a = new int[n];
for (int i = 0; i < n; i++)
a[i] = i + 1;
Print(a, n);
while (NextSet(a, n))
Print(a, n);
cin.get(); cin.get();
return 0;
} |
функция взята отсюда https://prog-cpp.ru/permutation/
|
|
22.05.2020, 16:36
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Код - срань.
function swap(a, i, j) {
var s = a[i];
a[i] = a[j];
a[j] = s;
}
function NextSet(a, n) {
var j = n - 2;
while (j != -1 && a[j] >= a[j + 1]) {
j--;
}
if (j == -1) {
return false;
}
var k = n - 1;
while (a[j] >= a[k]) {
k--;
}
swap(a, j, k);
var l = j + 1,
r = n - 1;
// сортируем оставшуюся часть последовательности
while (l < r) {
swap(a, l++, r--);
}
return true;
}
// вывод перестановки
function Print() {
var num = 1; // номер перестановки
return function (a, n) {
var message = num++ + ': ';
for (var i = 0; i < n; i++) {
message += a[i] + ' ';
}
console.log(message);
};
}
var n = prompt('N = '),
a = [];
for (var i = 0; i < n; i++) {
a[i] = i + 1;
}
var log = Print();
log(a, n);
while (NextSet(a, n)) {
log(a, n);
}
Результат смотрите в консоли.
|
|
22.05.2020, 18:40
|
Новичок на форуме
|
|
Регистрация: 20.05.2020
Сообщений: 6
|
|
Можете пожалуйста привязать работу данного скрипта к этому html документу?
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Перестановки.</title>
<link rel="stylesheet" href="style.css" >
</head>
<body>
<h1>Перестановки.</h1>
<div>
<input id="b1" name="input" type="button" value="Все перестановки из" onclick="">
<input id="number" style="width: 15px;" name="input" type="text" maxlength="1"> элементов.
</div>
<div id="res" style="text-align: left"></div>
<script></script>
</body>
</html>
Последний раз редактировалось Gaara_sand1, 22.05.2020 в 18:43.
|
|
22.05.2020, 19:05
|
Новичок на форуме
|
|
Регистрация: 20.05.2020
Сообщений: 6
|
|
можно узнать еще почему при вводе 0 начинается бесконечный цикл
|
|
22.05.2020, 19:32
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
перестановка
Gaara_sand1,
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Перестановки.</title>
<link rel="stylesheet" href="style.css" >
</head>
<body>
<h1>Перестановки.</h1>
<div>
<input id="b1" name="input" type="button" value="Все перестановки из" >
<input id="number" style="width: 15px;" name="input" type="text" maxlength="1" value="4"> элементов.
</div>
<div id="res" style="text-align: left"></div>
<script>
function perms(xs){
var r=[];
for (var i=0;i<xs.length;i++){
var xs_ = xs.slice(),
x = xs_.splice(i, 1),
ps = xs_.length ? perms(xs_) : [[]];
r.push(...ps.map(p=>x.concat(p)));
}
return r;
}
b1.addEventListener("click" , function(event) {
var length = number.value = +number.value||0;
var arr = Array.from({length}, (_, i) => ++i);
arr = perms(arr);
res.innerHTML = `${arr.join("<br>")}<br>Всего: ${arr.length}`
});
</script>
</body>
</html>
Последний раз редактировалось рони, 23.05.2020 в 08:38.
|
|
23.05.2020, 05:17
|
Новичок на форуме
|
|
Регистрация: 20.05.2020
Сообщений: 6
|
|
рони,
можете пожалуйста объяснить как работает данная функция и можно ли сделать чтобы при введении нуля выдавало просто "Всего:0"
Последний раз редактировалось Gaara_sand1, 23.05.2020 в 05:26.
|
|
23.05.2020, 08:43
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Сообщение от Gaara_sand1
|
можно ли сделать чтобы при введении нуля выдавало просто "Всего:0"
|
добавлено, смотрите код выше.
Сообщение от Gaara_sand1
|
можете пожалуйста объяснить как работает данная функция
|
мне сложно это сделать, возможно кто-то другой даст правильное обьяснение.
|
|
24.05.2020, 11:09
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,124
|
|
Gaara_sand1,
было [1, 2, 3]
извлекли 1 "умножили" на все комбинации [2, 3]
было [2, 3] извлекли 2 "умножили" на все комбинации [3] и т.д.
function perms(xs){
var r=[];
for (var i=0;i<xs.length;i++){//[1, 2, 3]
var xs_ = xs.slice(),//[2, 3]
x = xs_.splice(i, 1),//1
ps = xs_.length ? perms(xs_) : [[]];//все комбинации
r.push(...ps.map(p=>x.concat(p)));// "умножили"
}
return r;
}
как то так...
|
|
|
|