/*
* 标题:幸运数
幸运数是波兰数学家乌拉姆命名的。它采用与生成素数类似的“筛法”生成。首先从1开始写出自然数1,2,3,4,5,6,.... 1 就是第一个幸运数。 我们从2这个数开始。把所有序号能被2整除的项删除,变为:
1 _ 3 _ 5 _ 7 _ 9 ....
把它们缩紧,重新记序,为: 1 3 5 7 9 .... 。这时,3为第2个幸运数,然后把所有能被3整除的序号位置的数删去。注意,是序号位置,不是那个数本身能否被3整除!! 删除的应该是5,11, 17, ...此时7为第3个幸运数,然后再删去序号位置能被7整除的(19,39,...)最后剩下的序列类似:
1, 3, 7, 9, 13, 15, 21, 25, 31, 33, 37, 43, 49, 51, 63, 67, 69, 73, 75,79, ...
本题要求:
输入两个正整数m n, 用空格分开 (m < n < 1000*1000)程序输出 位于m和n之间的幸运数的个数(不包含m和n)。
例如:用户输入:1 20程序输出:5例如:用户输入:30 69程序输出:8
*/
自己的解法:
(8g的内存i7处理器64bit的Mac运行了10多秒才出结果数据大了怎么算确实不一样)
package e;
import java.util.Scanner;
public class e {
public static void main(String[] args) {
int ii[] = new int[1000000];
for (int i = 1; i <= 1000000; i++) {
ii[i - 1] = i;
}
boolean flag = false, flag1 = false;
int bcs = 1;
int i1 = 0;
int itemp = 2;
int maxitemp = 0;
int temp = 0;
for (int p = 0; p < 1000000; p++) {
if (flag)
itemp = ii[bcs++];
if (maxitemp < itemp) {
maxitemp = itemp;
}
flag = true;
for (int j = 0; j < 1000000; j++) {
if ((j + 1) % itemp == 0) {
ii[j] = 0;
}
}
for (int t = 0; t < 1000000; t++) {
if (ii[t] > 0) {
ii[i1] = ii[t];
i1++;
}
}
i1 = 0;
if (ii[bcs] < maxitemp) {
break;
}
}
Scanner s = new Scanner(System.in);
String str = s.nextLine();
char[] c = str.toCharArray();
int[] isr = new int[2];
int isri = 0;
StringBuffer sb1 = new StringBuffer();
for (int q = 0; q < c.length; q++) {
if ((int) c[q] == 32) {
if (sb1 != null) {
String sb2 = new String(sb1);
sb1 = new StringBuffer();
isr[isri++] = Integer.parseInt(sb2);
}
} else {
sb1.append(c[q]);
if (q == c.length - 1) {
String sb2 = new String(sb1);
isr[isri] = Integer.parseInt(sb2);
}
}
}
int count=0;
for (int y = 0; y < 999999; y++) {
if (ii[y + 1] < ii[y]) {
flag1 = true;
}
if (!flag1) {
if(isr[0]<ii[y]&&isr[1]>ii[y])
{
count++;
}
}
}
System.out.println(count);
}
}
官方解法:
import java.util.Scanner;
public class Main {
static int a[] = new int[500000 + 1];
static void lucky(int start, int a[], int len) {
int k = start, num = a[start];
for (int i = k; i < len; i++)
if (i % num != 0)
a[k++] = a[i];
if (num < len)
lucky(start + 1, a, k);
}
public static void main(String[] args) {
int len = 500000, kinds = 0;
for (int i = 1; i < len; i++)
a[i] = 2 * i - 1;
lucky(2, a, len);
Scanner cin = new Scanner(System.in);
int m = cin.nextInt();
int n = cin.nextInt();
long sta = System.currentTimeMillis();
for (int i = 1; i < len; i++) {
if (a[i] >= n || a[i] == a[i - 1])
break;
if (a[i] > m && a[i] < n)
kinds++;
}
System.out.println(kinds);
}
}