Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ответ 002 на задачу N 23
 
 автор: cheops   (13.10.2008 в 00:25)   письмо автору
 
 

Имя участника 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$j9) * $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_outstrlen($out) - $j'0'STR_PAD_LEFT);
    }
    if (
$j > -&& $j 0)
    {
        
$t_out = (substr($out0$j) * $p) . $t_out;
        
$p 0;
    }
    if (
$p == 1$out '1' $t_out;
    else 
$out $t_out;
    
$out substr_replace($outsubstr($out, -11) + 1strlen($out) - 11);
}
$g_end microtime(1);
fputs($f_out$out);
$w_end microtime(1);
$g_time round($g_end $start3);
$w_time round($w_end $g_end3);
$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:59)   письмо автору
 
   для: cheops   (13.10.2008 в 00:25)
 

Ответ правильный. Однако, даже запуская скрипт вне браузера и выставляя ему повышенный приоритет практически невозможно дождаться. Это связана с интерпретируемостью языка PHP и представлением строк - лучше перекладывать рутинные операции с большими числами на быстрые и специализированные средства, в частности на расширение GMP.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования