A-A+

使用PHP求最大奇约数的和

2022年06月07日 我爱编程 暂无评论

本篇文章介绍一下使用PHP如何求最大奇约数的和,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.

现在给出一个N,需要求出 f(1) + f(2) + f(3)…….f(N)

例如: N = 7

f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21

小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。

  1. <?php
  2. $num = trim(fgets(STDIN));
  3. function jNum($num){
  4.         $m = $num/2;
  5.         $res = 1;
  6.         if($num&0x1 == 1){//如果他本身就是个奇数,那么他的最大奇约数就是他本身
  7.                 $res = $num;
  8.                 goto HELL;
  9.         }
  10.         for($i = 1; $i<=$m$i=$i+2){//如果不是,那么就从1开始一直往上除,每次+2(奇数)
  11.                 if($num%$i==0){
  12.                         $res = $i;
  13.                 }
  14.         }
  15.         HELL:
  16.         return $res;
  17. }
  18. function jNum2($num)
  19. {
  20.         $res = 0;
  21.         for($i=1;$i<=$num;$i++){
  22.                 if(($i&0x1) == 1){//如果他本身就是个奇数,那么他的最大奇约数就是他本身
  23.                         $res+=$i;
  24.                 }else{
  25.                         $n = $i;
  26.                         while(true){//优化,从最大的数开始往下除
  27.                                 $n = $n>>1;
  28.                                 if(($n&0x1) == 1){
  29.                                         $res+=$n;
  30.                                         break;
  31.                                 }
  32.                         }
  33.                 }
  34.         }
  35.         HELL:
  36.         return $res;
  37. }
  38. function jNum3($num){//公式法
  39.         if($num == 1){
  40.                 return 1;
  41.         }
  42.         if(($num&0x1) == 0){
  43.                 return jNum3($num>>1)+$num*$num/4;
  44.         }else{
  45.                 return jNum3($num-1)+$num;
  46.         }
  47. }
  48. //$sum = 0;
  49. //for($i = 1; $i<=$num; $i++){
  50. //      $sum+=jNum($i);
  51. //}
  52. //echo $sum;
  53. //echo jNum2($num);
  54. echo jNum3($num);

开始常规思路,一直调试的方法1,一直超时,改为方法2,还是超时,没有什么本质区别。

换思路。。

求sum(i)的过程中,如果i 为奇数可以直接求,就是 i 本身,即f(i) = i。

问题就是求所有f(i), i为偶数的和。

因为是最大奇约数,所以f(2k) = f(k),所以f(2) + f(4) + … + f(2k) = f(1) + f(2) + … + f(k);

所以,数学归纳法,可以求出通用公式

使用PHP求最大奇约数的和

这个做法还是不容易想到的。。。这么BT的题。。

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录