算法学习之处-运用基本的逻辑与数学知识进行简单的循环遍历 代码人生

假设有这么一道数学题:

求第2333个能被2或者被3整除的正整数是…?

举例:(被2或者被3整除的正整数依次是:2,3,4,6,8,9,10,12,14,15,16,18…)

我们也可以使用最基本的数学方法来算:0.png

这个时候,数字比较大,用数学的方法就比较吃力费时了,当然,不排除你是个牛人。运算速度超常人,可以不用往下看了,渣渣 -_-|| 颤抖吧!

首先是来看看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是停止遍历并且把结果输出,但是这个方法貌似很不好,只是本人确实水平不好,正在学习中...哈哈下次再见。


admin 发布于  2016-4-22 11:53