算法学习之处-运用基本的逻辑与数学知识进行简单的循环遍历 代码人生
假设有这么一道数学题:
求第2333个能被2或者被3整除的正整数是…?
举例:(被2或者被3整除的正整数依次是:2,3,4,6,8,9,10,12,14,15,16,18…)
我们也可以使用最基本的数学方法来算:
这个时候,数字比较大,用数学的方法就比较吃力费时了,当然,不排除你是个牛人。运算速度超常人,可以不用往下看了,渣渣 -_-|| 颤抖吧!
首先是来看看PHP版:
<?php
function getResult($times){
$i = 0;
$n = 1;
while(true){
if(!($n%2) || !($n%3)){
$i++;
if($i == $times){
return $n;
}
}
$n++;
}
}
echo getResult(2333);
?>
然后看看Java版:
public class Main { public static void main(String[] args) { int cnt=0,num=1; while(true) { if(num%2==0||num%3==0)cnt++; if(cnt==2333)break; num++; } System.out.println(num); } }
Python版本:
[i for i in range(0,8000) if not(i%2 and i%3)][2333]
再看看C++:
//O(1)复杂度,不解释 #include <iostream> using namespace std; bool Check(int m, int n){ if(m%2 ==0 || m%3 == 0){ return m/2 + m/3 - m/6 ==n; } return false; } int Get(int n){ int top = (n-3)/4*6; while(!Check(top, n))//最多循环10次 ++top; return top; } int main(){ cout<<Get(2333)<<endl; }
还有Go语言版本:
func main() {
var x int
c := 2333
//c = x/2+ x/3-x/6==>x=2*c/3 + c%2
x = 3*c/2 + c%2
fmt.Println(x)
}
javascript版本:
var arr = []; var a = 0; while(arr.length < 2334) { a++; if (a % 3 == 0 || a % 2 == 0) { arr.push(a); } } console.log(arr[2332]);php版本呢,我自己还写了个利用数组的方法:
把成立的结果放在数组里(把范围限制在4000以下,不然一直循环下去没完没了-_-|),key按照自增排列,最后foreach遍历,遍历到key值为2333是停止遍历并且把结果输出,但是这个方法貌似很不好,只是本人确实水平不好,正在学习中...哈哈下次再见。