Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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, $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:59)   письмо автору
 
   для: cheops   (13.10.2008 в 00:25)
 

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

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

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