简单的动态规划。
找到状态转移方程,禁止暴力遍历的方式确定p2、p3、p5、p7的选择。
在纸上画一画,方便理解。
下面这个是用List集合实现的,下面还有一个用数组实现的。用时1600ms,同样的代码用c++实现才100+ms 这效率差距真是一个数量级了...-_-#
package hudOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main1058
{
public static void main(String[] args) throws IOException
{
int cnt = 0;
ArrayList<Integer> ans = new ArrayList<>();
int p2=0, p3=0, p5=0, p7=0;
ans.add(1);
while (ans.get(cnt)<2000000000)
{
ans.add(Math.min(Math.min(ans.get(p2)*2, ans.get(p3)*3), Math.min(ans.get(p5)*5, ans.get(p7)*7)));
++cnt;
if(ans.get(p2)*2==ans.get(cnt))
p2++;
if(ans.get(p3)*3==ans.get(cnt))
p3++;
if(ans.get(p5)*5==ans.get(cnt))
p5++;
if(ans.get(p7)*7==ans.get(cnt))
p7++;
// System.out.println(p2+" "+p3+" "+p5+" "+p7);
}
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
while(true)
{
int key = Integer.parseInt(stdin.readLine());
if (key==0) break;
if (key%10==1 && key%100!=11) System.out.printf("The %dst humble number is %d.", key, ans.get(key-1));
else if (key%10==2 && key%100!=12) System.out.printf("The %dnd humble number is %d.", key, ans.get(key-1));
else if (key%10==3 && key%100!=13) System.out.printf("The %drd humble number is %d.", key, ans.get(key-1));
else System.out.printf("The %dth humble number is %d.", key, ans.get(key-1));
System.out.println();
}
}
}
/*
1
2
3
4
11
12
13
21
22
23
100
1000
5842
0
*/
大数组实现
package hudOJ;
import java.util.Scanner;
public class Main1058array
{
public static void main(String[] args)
{
int cnt = 0;
int[] ans = new int[5888];
int p2=0, p3=0, p5=0, p7=0;
ans[0] = 1;
while (ans[cnt]<2000000000)
{
ans[++cnt] = Math.min(Math.min(ans[p2]*2, ans[p3]*3), Math.min(ans[p5]*5, ans[p7]*7));
if(ans[p2]*2==ans[cnt])
p2++;
if(ans[p3]*3==ans[cnt])
p3++;
if(ans[p5]*5==ans[cnt])
p5++;
if(ans[p7]*7==ans[cnt])
p7++;
// System.out.println(p2+" "+p3+" "+p5+" "+p7);
}
Scanner stdin = new Scanner(System.in);
while(stdin.hasNext())
{
int key = stdin.nextInt();
if (key==0) break;
if (key%10==1 && key%100!=11) System.out.printf("The %dst humble number is %d.", key, ans[key-1]);
else if (key%10==2 && key%100!=12) System.out.printf("The %dnd humble number is %d.", key, ans[key-1]);
else if (key%10==3 && key%100!=13) System.out.printf("The %drd humble number is %d.", key, ans[key-1]);
else System.out.printf("The %dth humble number is %d.", key, ans[key-1]);
System.out.println();
}
}
}
/*
1
2
3
4
11
12
13
21
22
23
100
1000
5842
0
*/