【PHP】求最大奇约数的和
来源:互联网 发布:骑马与砍杀捏脸数据男 编辑:程序博客网 时间:2024/05/03 09:53
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数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
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。
<?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);
所以,数学归纳法,可以求出通用公式
这个做法还是不容易想到的。。。这么BT的题。。
阅读全文
1 0
- 【PHP】求最大奇约数的和
- 最大的奇约数和
- 最大的奇约数
- 最大的奇约数
- 最大的奇约数
- 最大的奇约数
- 最大的奇约数
- 网易2016 求所有奇约数和
- 网易笔试题:最大的奇约数
- [编程题] 最大的奇约数
- [编程题] 最大的奇约数
- 【算法题】最大的奇约数
- 网易笔试题:最大的奇约数
- 网易编程题--最大的奇约数
- [编程题] 最大的奇约数
- [编程题]最大的奇约数
- 网易校招2017笔试题-求最大奇约数和
- 最大奇约数
- Kali新手喝咖啡(Caffe)的艰辛之路
- 数据结构之链表
- pat 乙级 1062. 最简分数(20)
- 小学期 编程珠玑
- 指针和数组总结
- 【PHP】求最大奇约数的和
- 单元测试中关于桩函数和打桩
- LinkedList<E>泛型类的遍历,排序和查找
- JSON
- jetty 解除 js 等文件静态占用,热部署
- 棋牌游戏携带的远控木马分析
- Index of /virtualbox/5.0.28
- FAT32文件系统的数据区定位及内容(三)
- SVG渐变