|
|
|
| Имя участника Kedana4i
С условиями задачи можно ознакомится по ссылке.
Скрипт берет из файла in.txt количество единиц в двоичном числе. Десятичное представление записывает в out.txt. Только оно медленное получилось до ужаса. 5000 единиц за 38 секунд на celeron 2GHz.
<?php
$f_in = @fopen('in.txt', 'r');
$f_out = @fopen('out.txt', 'w');
if (!$f_in) die ('Ошибка чтения файла.');
if (!$f_out) die ('Ошибка создания файла');
$str = fgets($f_in);
$d_count = intval($str);
if ($d_count <= 0) die ('Длинна должна быть положительным числом.');
$start = microtime(1);
$out = '1';
$j = 0;
for ($i = 2; $i <= $d_count; $i++)
{
$p = 0;
$t_out = '';
if (strlen($out) < 9) $t_out = $out * 2;
else
for ($j = strlen($out) - 9; $j >= 0; $j -= 9)
{
$t = substr($out, $j, 9) * 2 + $p;
if ($t > 999999999)
{
$t_out = ($t - 1000000000) . $t_out;
$p = 1;
}
else
{
$t_out = $t . $t_out;
$p = 0;
}
if (strlen($t_out) + $j < strlen($out)) $t_out = str_pad($t_out, strlen($out) - $j, '0', STR_PAD_LEFT);
}
if ($j > -9 && $j < 0)
{
$t_out = (substr($out, 0, 9 + $j) * 2 + $p) . $t_out;
$p = 0;
}
if ($p == 1) $out = '1' . $t_out;
else $out = $t_out;
$out = substr_replace($out, substr($out, -1, 1) + 1, strlen($out) - 1, 1);
}
$g_end = microtime(1);
fputs($f_out, $out);
$w_end = microtime(1);
$g_time = round($g_end - $start, 3);
$w_time = round($w_end - $g_end, 3);
$t_time = $g_time + $w_time;
if ($w_time == 0) $w_time = '< 0.001';
echo '<table>
<tr><td>Генерация</td><td>' . $g_time . ' c</td></tr>
<tr><td>Запись</td><td>' . $w_time . ' c</td></tr>
<tr><td>Всего</td><td>' . $t_time . ' c</td></tr>
</table>';
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(13.10.2008 в 00:25)
| | Ответ правильный. Однако, даже запуская скрипт вне браузера и выставляя ему повышенный приоритет практически невозможно дождаться. Это связана с интерпретируемостью языка PHP и представлением строк - лучше перекладывать рутинные операции с большими числами на быстрые и специализированные средства, в частности на расширение GMP. | |
|
|
|