题目描述如下:
The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
How many circular primes are there below one million?
public class Problem35
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
List<Integer> array = new ArrayList<Integer>();
for (int i = 2; i < 1000000; i++)
{
if(!contain2468(i) && !array.contains(i))
{
List<Integer> list = getCircular(i);
boolean flag = true;
for (Integer integer : list)
{
if(!MathUtils.isPrime(integer))
{
flag = false;
break;
}
}
if(flag)
{
array.addAll(list);
}
}
}
System.err.println("number:" + array.size());
System.err.println("time:" + (System.currentTimeMillis() - start));
}
public static List<Integer> getCircular(int num)
{
// 1357 3571 5713 7135
List<Integer> list = new ArrayList<Integer>();
int length = MathUtils.getLength(num);
int temp = num;
int max = ((int) Math.pow(10, length - 1));
boolean flag = true;
while (flag)
{
list.add(temp);
int other = temp / max + ((temp % max) * 10);
if(other == num)
{
flag = false;
}
temp = other;
}
return list;
}
/**
* 除2以外的数是否包含2、4、6、8、0,用时254ms
* 移除除5以外所有包含5的,用时189ms
*
*
* @param num
* @return 包含返回true
*/
public static boolean contain2468(int num)
{
String temp = String.valueOf(num);
if (num == 2 || num == 5)
{
return false;
}
if (temp.contains("0") || temp.contains("2") || temp.contains("4")
|| temp.contains("6") || temp.contains("8") || temp.contains("5"))
{
return true;
}
return false;
}
}
result
number:55
time:195