Все возможные вариации (PHP)

Статус
В этой теме нельзя размещать новые ответы.
Кстати, условия ты описал одни, а в примере привел решение для других. Ты пропустил результат 0000 итд. А если он не нужен, тогда замени "for ($ch=0;" на "for ($ch=1;", ну и проверку на то, что символ больше нуля тоже нужно вставить...
 
PHP:
$str="2232";

function get_all($str) {
    
    if (strlen($str)>1) {
        $prev_array=get_all(substr($str,1,strlen($str)-1));
    } else $prev_array=Array('');

    for ($ch=0;$ch<=$str[0];$ch++) {
        for ($i=0;$i<count($prev_array);$i++) {
            $cur_array[]=$ch.$prev_array[$i];
        }
    }
    return ($cur_array);
}

print_r(get_all($str));

ТС писал, что Но результат генерации не должен быть просто диапазоном от 0 до 2232, в результат генерации должны входить только те значения которые такой же длины как и начальное вхождение.

0000 это 0, а минимальное число, удовлетворяющее условию по идее должно быть 1000, а у ТС в примере это вообще 1111. Отсюда вывод: ТС составил неправильное ТЗ либо сам не знает что хочет получить
 
ТС писал, что Но результат генерации не должен быть просто диапазоном от 0 до 2232, в результат генерации должны входить только те значения которые такой же длины как и начальное вхождение.
0000 это 0, а минимальное число, удовлетворяющее условию по идее должно быть 1000, а у ТС в примере это вообще 1111. Отсюда вывод: ТС составил неправильное ТЗ либо сам не знает что хочет получить
1. ТЗ неправильное.
2. "0000" - та же длина, что и у начального значения.
3. Как сделать так, чтобы начиналось с 1 я уже написал :)
 
1. ТЗ неправильное.
2. "0000" - та же длина, что и у начального значения.
3. Как сделать так, чтобы начиналось с 1 я уже написал :)
Это все конечно замечательно, но твоя ф-я пропускает значения c тройкой на конце(1113,1123 и т.д.). Даже если вручную поссчитать, то для числа 2232, начиная с 1111, 44 возможных варианта

Добавлено через 2 минуты
а вообще если знать немного мат. статистику, то для любого числа с заданной вероятностью можно сосчитать количество полученных вариантов. К примеру для числа 3333 это 3^4 = 81 вариант (3 - макс. цифра, 4-номер старшего разряда)
 
Это все конечно замечательно, но твоя ф-я пропускает значения c тройкой на конце(1113,1123 и т.д.). Даже если вручную поссчитать, то для числа 2232, начиная с 1111, 44 возможных варианта
Мы немного по-разному поняли условие задачи. Разрядность каждого знака, как я понял, задается числом, стоящим на этом месте. Поэтому тройки на конце быть не может (ограничение 2). Для числа 2232, начиная с 1111 всего 23 варианта (2*3*2*2-1). Откуда взято число 44 - нипанятна ваще :)
Добавлено через 2 минуты
а вообще если знать немного мат. статистику, то для любого числа с заданной вероятностью можно сосчитать количество полученных вариантов. К примеру для числа 3333 это 3^4 = 81 вариант (3 - макс. цифра, 4-номер старшего разряда)
Разрядность меняется. Поэтому, считать надо примерно так:
(I0+1)*(I1+1)*...(In+1)-1, где I0,I1...In - символы строки.
Опять же, если начинать с 11111, то просто произведение символов минус единица.
 
Остается только валить все на неграмотного ТС) тему можно закрывать я думаю
 
Кстати, условия ты описал одни, а в примере привел решение для других. Ты пропустил результат 0000 итд...

ТС писал, что Но результат генерации не должен быть просто диапазоном от 0 до 2232, в результат генерации должны входить только те значения которые такой же длины как и начальное вхождение.
0000 это 0, а минимальное число, удовлетворяющее условию по идее должно быть 1000, а у ТС в примере это вообще 1111. Отсюда вывод: ТС составил неправильное ТЗ либо сам не знает что хочет получить

Да, это так, извиняюсь, сам заметил только тогда когда пальцем ткнули.
То есть первое сгерированное число должно состояться из всех 1. Для конкретного примера с числом 2232 это будит 1111.

А если он не нужен, тогда замени "for ($ch=0;" на "for ($ch=1;", ну и проверку на то, что символ больше нуля тоже нужно вставить...

Ну это понятно, познания в PHP у меня имеются(довольно не плохие).

tlittle
Спасибо то что нужно, работает быстро и идеально.

Проблема остается одна, огран памяти выделяемой для работы скрипта, но это уже совсем другая история:)

---------- Post added at 13:19 ---------- Previous post was at 11:53 ----------

Вот собственно код с подсчетом вариаций:

PHP:
<?php
$str="2232"; //начальное число

$temp_count = strlen($str);
$count_str=$str[0];
for($i=0; $i < $temp_count; $i++)
{
	if ($str[$i+1]<=0)
	{
		$str[$i+1]=1;
	}
	$count_str=$count_str*$str[$i+1];
}
echo $count_str; //возможное количество вариаций с учетом начального числа

function get_all($str)
{

    if(strlen($str)>1)
    {
        $prev_array=get_all(substr($str,1,strlen($str)-1));
    }
    else
    {
    	$prev_array=Array('');
    }

    for($ch=1;$ch<=$str[0];$ch++)
    {
        for($i=0;$i<count($prev_array);$i++)
        {
            $cur_array[]=$ch.$prev_array[$i];
        }
    }
    return ($cur_array);
}

print_r(get_all($str));  //результат генерации
?>
 
Функцию можно сократить, убрать ненужные переменные, и памяти меньше будет кушать. К примеру подсчет кол-во элементов массива из цикла убрать ;)
 
Так варианты нужно посчитать или вывести?
Если считать, то это просто мат.формула, тут и программу писать не надо, мы как-то когда учились, тоже на задачу сосчитать варианты написали программу, она все варианты перебрала и сосчитала, но препод такой ответ не принял - формулу попросил, даже предложение распечатать все варианты его не устроило :)
Так что осталось определить, чему учат: математике или программированию? :)
 
Так варианты нужно посчитать или вывести?...

Необходимо было сгенерировать все возможные варианты. Подсчет количества вариантов это уже вытекающий функционал (см. посты и окончательный вариант скрипта(на данный момент) выше).
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху