这个应该比较快一点的算法 public class CSDN12 { public static void main(String[] args) {
int count = 0; int MAX = 6 * 15000; int flag = 15000 -10; int tmp; int i=0; for( ; i < MAX ; i = i +10) { count += 6; tmp = i +1; if(tmp%3==0) count +=2; tmp = i +3; if(tmp%3==0) count +=2; if(count > flag)break; } while(count <= 15000) { i++; if(i%3==0||i%2==0||i%5==0) count++; } System.out.println(i); } }
你可以这样想 2*x + 3*y + 5*z 要求都要被整除的 那么x y z 都要大于1就好了
第一个数就是2×1 + 3×1 + 5×1 = 30 999到111有 999个 剩下的在后面+0就好了 多一个零就是多了999种 你可以算到15000个~ 我认为的算法大概就是这样。不知道是否符合要求。至于代码实现还需要LZ你自己去写。 呵呵。
我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员以及渴望学习java技术的初学者加入讨论。QQ群:3001581
while(m < 25000){
if(m%2 == 0 || m%3 == 0 || m%5 == 0)
j++;
if(j==15000)
break;
m++;
}
这样的算法是最简单的。LZ要的是优化算法。
int ret=(15000/22)*30+a[15000%22]
for(i;i<22000;i++)
{
if(m%2 == 0 || m%3 == 0 || m%5 == 0)
{
j++;
if(j=15000)
{
System.out.println((chr)j);
}
}
}
int[] arg = new int[1000000];
for(int i=2; i<arg.length;i++){
arg[i-2] = i;
}
return arg; }
void printer(int[] arg){
int[] temp = arg;
// for(int k = 0; k<temp.length;k++)
// {
// System.out.println(temp[k]);
// }
System.out.println("第15000个能被2,3,5整除的元素是temp[15000]= "+temp[15000]);
}
int[] search(int[] arg) {
int count = 0;
int j = 0;
int[] temp = new int[300000];
for (int m = 0; m < arg.length; m++) {
if (arg[m] % 2 == 0 && arg[m] % 3 == 0 && arg[m] % 5 == 0) {
temp[j++] = arg[m];
//j++;
count++;
if (arg[m] == 1500)
continue;
}
}
System.out.println("找到"+count+"个有效元素!");
return temp; }
public static void main(String[] args) {
Test2 t = new Test2();
int [] arg = t.fill();
int[] temp = t.search(arg);
t.printer(temp);}
}找到33335个有效元素!
第15000个能被2,3,5整除的元素是temp[15000]= 450030
每30个数中有22个符合条件,15000/22=681,15000-22*681=18,
2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25
所以答案就是30*681+25=20455具体到第任意N个,就先除以22,得到商和余数,商*30,余数计算出来,相加即可
由于每次只需要计算30以内的数,速度大大增加,当然还可以加一个30以内的数组对照表,不用计算直接查找加,应该是最快了
public class CSDN12 {
public static void main(String[] args) {
int count = 0;
int MAX = 6 * 15000;
int flag = 15000 -10;
int tmp;
int i=0;
for( ; i < MAX ; i = i +10)
{
count += 6;
tmp = i +1;
if(tmp%3==0)
count +=2;
tmp = i +3;
if(tmp%3==0)
count +=2;
if(count > flag)break;
}
while(count <= 15000)
{
i++;
if(i%3==0||i%2==0||i%5==0)
count++;
}
System.out.println(i);
}
}
楼上的,觉得却是是有规律的我来帮spiritsl(梦雨心蓝) 补充算法,呵呵
每30个数中有22个符合条件,15000/22=681,15000-22*681=18,
2 3 4 5 6 8 9 10 12 14 15 16 18 20 21 22 24 25
所以答案就是30*681+25=20455具体到第任意N个,就先除以22,得到商和余数,商*30,余数计算出来,相加即可
由于每次只需要计算30以内的数,速度大大增加,当然还可以加一个30以内的数组对照表,不用计算直接查找加,应该是最快了//强
private void searth(){
int i,count=0;
for (i=2;;i++)
{
if(i%2 == 0||i%3 == 0||i%5 == 0)
{count++;System.out.println(i);
}
if(count==15000) break;
}
System.out.println("结果="+i);
}
public static void main(String [] args){
MathTest mt = new MathTest();
mt.searth();
}
}
结果时20455