Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP解决这个问题?_Php - Fatal编程技术网

如何使用PHP解决这个问题?

如何使用PHP解决这个问题?,php,Php,假设给出了一个正整数类型的数字,例如:312。请帮助我用PHP编写一个程序,将给定的数字转换为具有相同位数的新数字,并且新数字的所有位数必须等于给定数字的任何位数(例如:333、111、222,每次只能将每个数字递减或递增1)。但仅打印生成序列所需步骤较少的数字序列,并打印生成该序列所需步骤的数量 说明: 输入:正整数N(例如:312) 将数字(312)转换为3的序列 3 2 2 3 3 2 三三三 这里的步骤数=3 现在,将数字(312)转换为1的序列 2 1 2 1 1 2 11 这里的步骤

假设给出了一个正整数类型的数字,例如:312。请帮助我用PHP编写一个程序,将给定的数字转换为具有相同位数的新数字,并且新数字的所有位数必须等于给定数字的任何位数(例如:333、111、222,每次只能将每个数字递减或递增1)。但仅打印生成序列所需步骤较少的数字序列,并打印生成该序列所需步骤的数量

说明: 输入:正整数N(例如:312)

将数字(312)转换为3的序列

3 2 2

3 3 2

三三三

这里的步骤数=3

现在,将数字(312)转换为1的序列

2 1 2

1 1 2

11

这里的步骤数=3

最后将数字(312)转换为2的序列

2 1 2

2 2

这里的步骤数=2

因此,产出:222

步骤数:2

这是我试过但失败的东西

<?php

$num = 312;
$arr_num = array_map('intval', str_split($num));

//steps taken for each sequence will be stored in this array
$steps = array();

//printing number
for($i = 0; $i < count($arr_num); $i++)
    echo $arr_num[$i];


//calculation
for($i = 0; $i < count($arr_num); $i++) {
    $count = 0;

    for($j = 0; $j < count($arr_num); $j++) {

        if($arr_num[$i] == $arr_num[$j])
            ++$j;

        elseif($arr_num[$i] > $arr_num[$j]) {

            while($arr_num[$j] != $arr[$i]) {
                $arr_num[$j] += 1;
                $count++;
            }
        }

        else {
            while($arr_num[$j] != $arr_num[$i]) {
                $arr_num[$j] -= 1;
                $count++;
            }
        }
    }
    //pushing the count to steps array for each sequence
    array_push($steps, $count);

}
//I am stuck here...can't find the further solution
?>
这是有效的(根据我的快速测试):

$intIn=312;
#函数changeDigits($intIn){//取消对函数的注释
$digits=str_split($intIn);//转换为数字数组
$numerOfDigits=计数($digits);
$numberOfSteps=array();
#检查数字中的每个数字
对于($i=0;$i<$numerOfDigits;$i++){
$numberOfSteps[$i]=0;
$currentDigit=$digits[$i];
#计算递增/递减数,将其他数字更改为该数字
foreach($otherDigit作为$otherDigit的数字){
如果($currentDigit>$otherDigit)$numberOfSteps[$i]+=$currentDigit-$otherDigit;
如果($currentDigit<$otherDigit)$numberOfSteps[$i]+=$otherDigit-$currentDigit;
}
}
$digitKey=数组搜索(最小($numberOfSteps),$numberOfSteps);
回显“步骤数:”。$numberOfSteps[$digitKey].PHP_EOL;//(或“
”) 回显“newnumber=”.str_repeat($digits[$digitKey],$numberofdigits); #} #更改数字(312);
我开发了这个代码。请看一下

<?php
    function find_output($input)
    {
        $digits = str_split($input);

        foreach ($digits as $index => $d) {
            $new_array = $digits;
            unset($new_array[$index]);
            $sum = 0;
            foreach ($new_array as $value) {
                $sum += abs($d - $value);
            }
            $final_array[$d] = $sum;
        }
        $steps = min($final_array);
        echo "steps : " . $steps . '<br>';
        $final_value = array_search(min($final_array), $final_array);
        echo "Output: " . implode(array_fill(0, count($digits), $final_value));
    }

    find_output(819);
    ?>

我想这就行了

<?php
$input = 312;
$input_array = [];
for($x=0;$x<3;$x++) {
    array_push($input_array,strval($input)[$x]);
}

function equalize($input_array, $mark) {
    $i = 0;
    for($x=0;$x<count($input_array);$x++) {
        $input_array[$x] = intval($input_array[$x]);
        #print($input_array[$x]);
        while($input_array[$x] != $mark) {
            if($input_array[$x] < $mark) {
                $input_array[$x] = $input_array[$x] + 1;
                $i++;
            }
            else {
                $input_array[$x] = $input_array[$x] - 1;
                $i++;
            }
        }
    }
    $output_val = intval($input_array[0] .$input_array[1] .$input_array[2]);
    return $output = [$output_val,$i];
}
#to first
$mark = $input_array[0];
$output = equalize($input_array, $mark);
#to second
$mark = $input_array[1];
$data = equalize($input_array, $mark);
if($data[1] < $output[1]) {
    $output = $data;
}
#to last
$mark = $input_array[2];
$data = equalize($input_array, $mark);
if($data[1] < $output[1]) {
    $output = $data;
}
echo 'Digit: ' .$output[0] .'<br/>';
echo 'Number of steps: ' .$output[1];
?>

输出:

array (
  'input' => '312',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '222',
      'steps' => 2,
    ),
  ),
)
array (
  'input' => '334',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '333',
      'steps' => 1,
    ),
  ),
)
array (
  'input' => '39',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '33',
      'steps' => 6,
    ),
    1 => 
    array (
      'sequence' => '99',
      'steps' => 6,
    ),
  ),
)

@你能帮我解决吗?像“19”这样的序列怎么样?
<?php
class SeqSolver
{
    public function solve($str_num)
    {
        if(!ctype_digit($str_num))
            throw new Exception('Invalid input.  Input string must contain digits between 0 and 9 only.');

        $digits = str_split($str_num);
        $length = count($digits);

        foreach(array_unique($digits) as $digit)
            $results[$digit] = $this->stepsToSequence($str_num, $digit);

        //var_export($results);
        $min_keys = array_keys($results, min($results));

        // Prepare result
        $result['input'] = $str_num;
        foreach($min_keys as $key)
            $result['solutions'][] = [
                'sequence' => str_repeat($key, $length),
                'steps'    => $results[$key]
            ];

        return $result;
    }

    public function stepsToSequence($str_num, $target_digit) {
        $digits = str_split($str_num);
        $steps  = 0;
        foreach($digits as $digit)
            $steps += abs($digit - $target_digit);

        return $steps;
    }
}
$solver = new SeqSolver;
foreach(['312', '334', '39'] as $input) {
    $result = $solver->solve($input);
    var_export($result);
    echo "\n";
}
array (
  'input' => '312',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '222',
      'steps' => 2,
    ),
  ),
)
array (
  'input' => '334',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '333',
      'steps' => 1,
    ),
  ),
)
array (
  'input' => '39',
  'solutions' => 
  array (
    0 => 
    array (
      'sequence' => '33',
      'steps' => 6,
    ),
    1 => 
    array (
      'sequence' => '99',
      'steps' => 6,
    ),
  ),
)