基础算法题
1.排它平方数
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
1. 6位正整数
2. 每个数位上的数字不同
3. 其平方数的每个数位不含原数字的任何组成数位
答案是一个6位的正整数。
请通过浏览器提交答案。
注意:只提交另一6位数,题中已经给出的这个不要提交。
注意:不要书写其它的内容(比如:说明性的文字)。
1 package nothing; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * 排它平方数 8 小明正看着 203879 这个数字发呆。 9 原来,203879 * 203879 = 41566646641 10 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。 11 具有这样特点的6位数还有一个,请你找出它! 12 再归纳一下筛选要求: 13 1. 6位正整数 14 2. 每个数位上的数字不同 15 3. 其平方数的每个数位不含原数字的任何组成数位 16 答案是一个6位的正整数。 17 请通过浏览器提交答案。 18 注意:只提交另一6位数,题中已经给出的这个不要提交。 19 注意:不要书写其它的内容(比如:说明性的文字)。 20 * @author hasee 21 * 22 */ 23 public class ExcludeNumber { 24 25 static boolean bit[] = new boolean[10]; 26 static List<Integer> list = new ArrayList<Integer>(); 27 public static void main(String[] args) { 28 excludeNumber(0); 29 30 } 31 //深度遍历,剪枝的回溯 32 public static void excludeNumber(int n){ 33 if(n == 6){ 34 long number=0; //注意溢出,不但平方后为long,此number也必须为long(不然运算时需要强制转换) 35 for (int i = 0; i < 6; i++) { 36 number += list.get(5-i)*(Math.pow(10, i)); //注意^是异或!!!,而次方是Math.pow!!! 37 } 38 long square = number*number; 39 char[] squStr = String.valueOf(square).toCharArray(); 40 char[] numStr = String.valueOf(number).toCharArray(); 41 for (char c0 : squStr) { 42 for (char c1 : numStr) if(c0 == c1) return; 43 } 44 System.out.println(number+"xxxx"+square); 45 return; 46 } 47 int first= n==0 ? 1 : 0; 48 for (int i = first; i < 10; i++) if(bit[i] == false){ 49 list.add(i); 50 bit[i] = true; 51 excludeNumber(n+1); 52 list.remove((Integer)i); 53 bit[i] = false; 54 } 55 } 56 }
题来自:http://blog.csdn.net/u012027907/article/details/14157077