Fibonacci序列 - codeabbey任务

时间:2014-08-08 19:13:42

标签: php

我开始解决 codeabbey.com 问题,并且遇到了这个问题。 我也正在尝试学习面向对象的PHP编码方式,我希望它不会非常难以阅读。

<小时/> 我遇到的问题:
当我使用单个输入值时(在'std'中只有两行,第二行是),一切正常 一切正常,我作为问题文件的每一个值,但是,如果我把整个数组,它循环并超时除了最后一个值之外的每个值。我在2000次迭代之后将超时用于测试目的,因为它一直循环直到php爆炸,否则。

我在这里做错了吗?我不确定为什么它适用于单个值,但是当我通过数组循环时它会保持超时。

我希望我很清楚,请提出任何问题,以便我可以编辑这篇文章。 谢谢!

我不能发布两个以上的链接,所以我猜你可以使用自己的语法着色。


<?php

class Input {                                       // Reading input file from codeabbey (in this case from 'std' file on my pc)
    public $first_line = null;                      // I am using this class in every problem on the site so its more complicated
    public $data = null;                            // than required for this problem

    public function __construct($input) {           // Puting 1st line (helper) in $firstline and rest of array in $data
        $input = file_get_contents($input);
        $input = explode("\n", $input);

        $this->first_line = $input[0];

        array_shift($input);

        $this->data = $input;
    }

    public function toIntegers() {                  // Convert strings from array in integers
        $data = $this->data;                        // Didn't use this for this problem
        foreach ($data as $key=>$value) {
            $data[$key] = (int)$value;
        }
        $this->data = $data;
    }

}

class Fibonacci {                                   // Creating Fibonacci array and counting steps for problem
    private $data;
    public $hits = array();
    public function __construct($input) {           // Loading input array in class
        $this->data = $input;
    }

    public function createFibonacci($number) {      // Function: Creating fibonacci array until it reaches certain number
        $fibonacci = array(0,1);                    // Argument: Limit number up to which array is created
        $a = true;                                  // Return:   Fibonacci array
        $count = 0;
        while ($a) {

            $length = count($fibonacci);
            $count++;
            $fibonacci[] = bcadd($fibonacci[$length-1], $fibonacci[$length-2]);
            if ($fibonacci[$length-1] == $number) {
                echo "found match as $count for number $number<br>";
                $this->hits[] = $count;
                $a = false;
            }
            if ($count > 2000) {
                $a = false;
                echo 'timed! <br>';
            }
        }

    }

    public function countIndex() {                  // Function: counting index at which given number occured
        foreach ($this->data as $key => $value) {   // Arguments: --
            $this->createFibonacci($value);         // Return: index number for each number in array
        }
    }
}


$input = new Input('std');
$data = $input->data;

$fibonacci = new Fibonacci($data);
$fibonacci->countIndex();

2 个答案:

答案 0 :(得分:0)

我刚刚找到的人......这只是太大而无法处理的数字:)

键入时:echo PHP_INT_MAX; 它将返回您在服务器上可以处理的最大整数(由于显而易见的原因,64位可以处理超过32位)。

在我的系统上(32位wamp):PHP_INT_MAX返回2147483647 并且列表中的所有数字都大于此数字,除了找到的数字63245986。

查看数字太大时会发生什么:Integer Overflow示例。 http://php.net/manual/en/language.types.integer.php

答案 1 :(得分:0)

所以解决方案(非常愚蠢):
因为我试图在新文件上做一些foreach循环和事情,我不小心注意到我的输入数组的var_dump给出的字符串长度比应该的+1 ...原来我在每一行的末尾都有当我用“/ n”爆炸文件时也是如此。使用我的编辑器(Netbeans)复制粘贴东西。

只需将“/ n”更改为“/ r”,文件就可以顺利运行。

public function __construct($input) {           // Puting 1st line (helper) in $firstline and rest of array in $data
        $input = file_get_contents($input);
        $input = explode("\r", $input);    // CHANGE \R INSTEAD OF \N

        $this->first_line = $input[0];

        array_shift($input);

        $this->data = $input;
    }

codeabbey.com 上,输入“\ n”适用于他们的php:// stdin文件。