任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
2013-06-30 16:58
946 查看
/** * 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。 如此往复,数字会落入某个循环圈(称为数字黑洞)。 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。 循环圈的输出格式仿照: [82962, 75933, 63954, 61974] 其中数字的先后顺序可以不考虑。 */ import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; public class 数字黑洞 { static Set<List> set = new HashSet<List>(); static int start = 0; public static void main(String[] args) { List list = new ArrayList(0); for (int i = 10000; i < 100000; i++) { if (i % 11111 == 0) { continue; } else { 检测循环圈(i, list); } } print(); } private static void print() { Iterator<List> it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } private static void 检测循环圈(int n, List list) { String s = n+""; char[] c = s.toCharArray(); int a = max(c); int b = min(c); int d = a -b ; if(寻找循环圈(d,list)){ List temp = new ArrayList(); temp.addAll(list.subList(start, list.size())); if(!contains(temp)&&temp.get(0)!=0){ set.add(temp); } list.clear(); return ; } list.add(d); 检测循环圈(d,list); } //去重 private static boolean contains(List temp) { boolean flag = false; Iterator<List> it = set.iterator(); while(it.hasNext()){ if(it.next().containsAll(temp)){ flag = true; break; } } return flag; } private static boolean 寻找循环圈(int n, List list) { for(int i = 0;i<list.size();i++){ if(list.get(i)==n){ start = i; return true; } } return false; } //计算最小的数字 private static int min(char[] c) { Arrays.sort(c); StringBuffer sb = new StringBuffer(String.valueOf(c)); return Integer.parseInt(sb.toString()); } //计算最大的数字 private static int max(char[] c) { Arrays.sort(c); StringBuffer sb = new StringBuffer(String.valueOf(c)); return Integer.parseInt(sb.reverse().toString()); } } 运行结果: [63954, 61974, 82962, 75933] [74943, 62964, 71973, 83952] [53955, 59994]
相关文章推荐
- 数字黑洞:任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到 * 一个最大的数:65432,一个最小的数23456。
- 假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、87
- 开平方 如果没有计算器,我们如何求2的平方根? 可以先猜测一个数,比如1.5,然后用2除以这个数字。
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 任何一个能够被3整除的正整数,取各位数字的立方和,再取各位数字的立方和, 重复有限次,必得到 153 这个数,且 153 再重复也还是153
- 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 【注意: 如果输入的大于了5位数要求用户重新输入】
- 有一个正整数,已知它的末位数字是6,如果将这个6移动到该数的最前面,那么所得到的数是原来数的4倍,求满足条件的最小正整数。
- 堆的数据结构能够使得堆顶总是维持最大(对于大根堆)或最小(对于小根堆),给定一个数组,对这个数组进行建堆,则平均复杂度是多少?如果只是用堆的 push 操作,则一个大根堆依次输入 3,7,2,4,1,5,8 后,得到的堆的结构示意图是下述图表中的哪个?
- 一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。
- “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- 开平方 如果没有计算器,我们如何求2的平方根? 可以先猜测一个数,比如1.5,然后用2除以这个数字。
- 如果一个箱子里面有100个球,有两个玩家,1和2,他们都很聪明,可以随机从箱子里面拿出2或6个球,箱子是透明的并且箱子里面有多少个球他们也可以看得到 ,如果算最后一个球能被谁拿到,谁就是
- 题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- 对于一个n位正整数a,去掉其中任意k(k<=n)个数字后,剩下的数字按原次序排列可以组成一个新的正整数。设计一个删数算法,使得剩下的数字组成的正整数最小。例如,a=13243221,k=5,输出:12
- 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- 整型数组处理算法(九)给定任意一个正整数,求比这个数大且最小的“不重复数”(性能优化)[2014百度笔试题]
- 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
- (百度笔试题)给定任意一个正整数,求比这个数大且最小的“不重复数”。
- 正则表达式匹配手机号码 写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。