黑马程序员技术交流社区
标题:
java的一个问题怎么做
[打印本页]
作者:
丶小天
时间:
2014-2-20 11:49
标题:
java的一个问题怎么做
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
这题怎么做?
作者:
漩涡java
时间:
2014-2-20 16:20
来和你增加人气!
作者:
57684621
时间:
2014-2-20 17:17
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
关注微信有你想不到的惊喜任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
*
* 思路:
* 1.把5个数字转换为长度为5的数组。
* 2.每个索引中的值都为0-9。
* 3.升序和降序排列。
* 4.将数组转换为字符串输出,然后将字符串转换为数字进行运算
* 5.对得到的数字进行递归运算,如果5位数全部相同,则停止循环。
* 6.将得到的数字装到list中。
* */
public class DigitDarkHoleDemo {
public static void main(String[] args) {
int x = 34256;
digitHole(x);
}
/*利用递归调用,每次获取到的数字,都跟集合中已经存在的数字相比较,若想等则说明找到该循环*/
public static void digitHole(int x){
int temp = getNum(x);
List<Integer> list = new ArrayList<>(10);
boolean flag = true;
while(flag){
list.add(temp);
temp=getNum(temp);
for(int i=0;i<list.size();i++){
if(temp == list.get(i)){
int index = list.indexOf(temp);
while(index>0){
try {
list.remove(0);
index--;
}catch (Exception e) {
e.printStackTrace();
}
}
flag=false;
break;
}
}
}
System.out.println(list);
}
@Override
public String toString() {//用集合来装数字黑洞中的循环圈
String str="[";
List<Integer> list = new ArrayList<>();
for(int i=0;i<list.size();i++){
if(i==list.size()-1){
str+=list.indexOf(i);
}else{
str+=list.indexOf(i)+",";
}
}
return str+"]";
}
public static int getNum(int num){//获得一个5位数的数字黑洞
int[] arr = new int[5];
int[] temparr = getArr(num);
if(temparr.length<5){
for(int i=0;i<5-temparr.length;i++){
arr[i] = 0;
}
}
System.arraycopy(temparr, 0, arr, arr.length-temparr.length, temparr.length);
Arrays.sort(arr);
int min = arr2Num(arr);//得到这个数字升序排列后的数字
invert(arr);
int max = arr2Num(arr);
int temp = max-min;//得到最大值减去最小值的差,得到新的数据
return temp;
}
public static int[] getArr(int x){//将得到的数变成一个数组,好进行升序与降序排列
String str = x+"";
char[] carr = str.toCharArray();
int[] arr = new int[carr.length];
for(int i=0;i<carr.length;i++){
arr[i] = Character.getNumericValue(carr[i]);
}
return arr;
}
public static int arr2Num(int[] arr){//将数组变成数字
String str = "";
for(int i=0;i<arr.length;i++){
str+=arr[i];
}
return Integer.parseInt(str);
}
public static void invert(int[] arr){//反转数组,用于将数组逆序排列
int temp = 0;
for(int i=0;i<arr.length/2;i++){
temp = arr[arr.length-1-i];
arr[arr.length-1-i] = arr[i];
arr[i] = temp;
}
}
}
复制代码
作者:
皓栎
时间:
2014-2-20 21:40
package day4;
import java.util.ArrayList;
import java.util.List;
/**
* 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。
* 求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
* 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
* 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
* 循环圈的输出格式仿照:[82962, 75933, 63954, 61974]
* 其中数字的先后顺序可以不考虑。
* @author Administrator
*/
public class DigitalBlackHole {
public static void main(String[] args) {
int num = 34258;
print(num);
}
//把循环圈内的数字提取出来,并规范成具有一定格式的字符串
private static void print(int num){
//直到第一次出现重复元素才终止循环,并装入集合中(包含第一次出现的重复元素)
ArrayList<Integer> list = new ArrayList<Integer>();
int ret = getSub(num);
while(ret != 0){
ret = getSub(ret);
if(list.contains(ret)){
list.add(ret);
break;
}else{
list.add(ret);
}
}
//用来装循环圈内的数字
List<Integer> subList = new ArrayList<Integer>();
for(int i = 0; i < list.size(); i++){
if(list.get(i).equals(list.get(list.size() - 1))){
subList = list.subList(i, list.size() - 1);
break;
}
}
//把集合内数字转换成字符串
String str = "[";
for(int i = 0; i < subList.size(); i++){
str += subList.get(i);
if(i != subList.size() - 1){
str += ",";
}
}
str += "]";
System.out.println(str);
}
//求最大数与最小数之差
private static int getSub(int num){
StringBuilder sb = new StringBuilder("");
sb.append(num);
char[] ch = sb.toString().toCharArray();
if(ch.length != 5){
for(int i = 0; i < 5 - ch.length; i++){
sb.append(0);
}
}
ch = sb.toString().toCharArray();
int subtract = descending(ch) - ascending(ch);
return subtract;
}
//数组元素升序排序(冒泡),并转换成int整数
private static int ascending(char[] arr){
int min = 0;
String str = "";
for(int i = 0; i < arr.length - 1; i++){
for(int j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j + 1]){
char temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (char c : arr) {
str += c;
}
min = new Integer(str);
return min;
}
//数组元素降序排序(选择),并转换成int整数
private static int descending(char[] arr){
int max = 0;
String str = "";
for(int i = 0; i < arr.length - 1; i++){
for(int j = i; j < arr.length - 1; j++){
if(arr[i] < arr[j + 1]){
char temp = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (char c : arr) {
str += c;
}
max = new Integer(str);
return max;
}
}
复制代码
排序方法好久没写了,就自己写了下升序和降序的方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2