今天小編給大家分享的是PHP求最大奇約數和的方法示例,很多人都不太了解,今天小編為了讓大家更加了解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
小易計算這個問題遇到了困難,需要你來設計一個算法幫助他。
<?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的題。。
以上就是PHP求最大奇約數和方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。