假设有这么一道数学题:
求第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是停止遍历并且把结果输出,但是这个方法貌似很不好,只是本人确实水平不好,正在学习中...哈哈下次再见。
