使用PHP求最大奇约数的和

来源:青灯夜游 发布时间:2020-05-09 10:55:40 阅读量:904

本篇文章介绍一下使用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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

<?php

$num = trim(fgets(STDIN));

 

function jNum($num){

        $m = $num/2;

        $res = 1;

        if($num&0x1 == 1){//如果他本身就是个奇数,那么他的最大奇约数就是他本身

                $res = $num;

                goto HELL;

        }

        for($i = 1; $i<=$m; $i=$i+2){//如果不是,那么就从1开始一直往上除,每次+2(奇数)

                if($num%$i==0){

                        $res = $i;

                }

        }

        HELL:

        return $res;

}

 

function jNum2($num)

{

        $res = 0;

 

        for($i=1;$i<=$num;$i++){

                if(($i&0x1) == 1){//如果他本身就是个奇数,那么他的最大奇约数就是他本身

                        $res+=$i;

                }else{

                        $n = $i;

                        while(true){//优化,从最大的数开始往下除

                                $n = $n>>1;

                                if(($n&0x1) == 1){

                                        $res+=$n;

                                        break;

                                }

                        }

                }

        }

 

        HELL:

        return $res;

}

 

function jNum3($num){//公式法

        if($num == 1){

                return 1;

        }

        if(($num&0x1) == 0){

                return jNum3($num>>1)+$num*$num/4;

        }else{

                return jNum3($num-1)+$num;

        }

 

}

//$sum = 0;

//for($i = 1; $i<=$num; $i++){

//      $sum+=jNum($i);

//}

//echo $sum;

 

//echo jNum2($num);

 

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);

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

1.png

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


标签: PHP
分享:
评论:
你还没有登录,请先