問題集への解答

#ID:2 フィボナッチ数列の生成

```php5
<?php
$t=[0,1];
$new=0;
$res=0;
for ($i=0; $new < 4000000; $i++) {
    $new=$t[0]+$t[1];
    if ($new%2==0) {
        $res+=$new;
    }
    //  print $new."\n";
    $t[0]=$t[1];
    $t[1]=$new;
}
  print $res."\n";
```

#ID:3 素因数を求める

最初のコード

```php5
<?php
$start = microtime(true);


function findFactor($num)
{
    $count=0;
    for ($i=$num; $i >2 ; $i--) {
        if ($num%$i==0) {
            $count++;
        }
        if ($count==2) {
            return false;
        }
    }
    return true;
}

const NUM=600851475143;
  // const NUM=13195;

for ($i=NUM; $i >2 ; $i--) {
  // print $i."\n";
    if (NUM%$i==0 && findFactor($i)) {
        print $i."\n";
        break;
    }
}

$end = microtime(true);

print '処理時間 = ' . ($end - $start) . '秒'."\n" ;

```
何時まで立っても割らなかった。
Macもファンがガンガン回ってメモリ利用量が半端じゃなかった。

##改良

```php5
<?php
$start = microtime(true);
$num=600851475143;
  
for ($i=2; $i <=$num ; $i++) {
  // print $i."\n";
    if ($num%$i==0) {
      $count=0;
        while($num%$i==0){
          $num/=$i;
          $count++;
        }
        print $i." e ".$count."\n";
    }
}

$end = microtime(true);

print '処理時間 = ' . ($end - $start) . '秒'."\n" ;

```
1から数えていく方式をやめた。

#ID:4 回文を作成

```php5
<?php
$start = microtime(true);
play();
$end = microtime(true);
print '処理時間 = ' . ($end - $start) . '秒'."\n" ;


function play()
{
    for ($i=999; $i >0 ; $i--) {
        for ($j=999; $j >0 ; $j--) {
            $num=$i*$j;
            // print $num."\n";
            if (checkPalindrome($num)) {
                $a[]=checkPalindrome($num);
            }
        }
    }
    print max($a);
}

function checkPalindrome($num)
{
    $num=(string)$num;

    if (strlen($num)%2==0 && strlen($num)>4) {
        if ($num[0]==$num[strlen($num)-1] && $num[1]==$num[strlen($num)-2] && $num[2]==$num[strlen($num)-3]) {
            return $num;
        }
    }
    return false;
}

```
checkPalindrome関数のif文が無理やり過ぎてもっといい方法がないものかと思った。

#ID5 最小公倍数を求める

```php5
<?php
$start = microtime(true);
play();
$end = microtime(true);
print "\n".'処理時間 = ' . ($end - $start) . '秒'."\n" ;


function play()
{
    print check(20);
}


function check($num)
{
    $res=[];
    $anser=1;
    for ($i=2; $i <=$num ; $i++) {
        // print "[".$i."]\n";
        $tmp=$i;
        for ($j=2; $j <=$tmp ; $j++) {
            $count=0;
            if ($tmp%$j==0) {
                while ($tmp%$j==0) {
                    $tmp/=$j;
                    $count++;
                }
                print $j." e ".$count."\n";
                $res[$j]=$res[$j]<$count? $count:$res[$j];
            }
        }
    }
    print_r($res);
    foreach ($res as $key => $value) {
        $anser*=$key**$value;
    }
    return $anser;
}
```
配列のところでエラーが出るが今回は無視

#ID:6足してから2乗の合計-2乗の合計
```php5
 
$start = microtime(true);
play();
$end = microtime(true);
print "\n".'処理時間 = ' . ($end - $start) . '秒'."\n" ;


function play()
{
  $sqSum=0;
  $sumSq=0;
    for ($i=1; $i <=100 ; $i++) {
      $sqSum+=$i**2;
      $sumSq+=$i;
    }
    
    print $sumSq**2-$sqSum;
}

```

#ID7 10001番目の素数
```php5
<?php
$start = microtime(true);
play();
$end = microtime(true);
print "\n".'処理時間 = ' . ($end - $start) . '秒'."\n" ;


function play()
{
$res=[];
for ($i=2; $i <1000000 ; $i++) {
  if(checkPrime($i)){
    print $i."\n";
    $res[]=$i;
  }
  if(count($res)>10001)break;
}
print_r($res);
}

function checkPrime($num){
  // print "[".$num."]\n";
  $count=0;
  for ($i=2; $i <$num ; $i++) {
    // print "$i\n";
    if ($num%$i==0) {
      return false;
   }
  }
  return true;
}

```
処理には1分かかった。