有趣的数字 6174

在网上看到一个有趣的算法:把一个四位数的四个数字由小至大排序,组成一个新数, 又由大至小排序组成一个新数,这两个数相减, 之后重复这个步骤, 只要四位数的四个数字不完全相同(如9999),数字最终便会变成 6174。


最终显示要转换成6174迭代最多为7次


java实现代码 

/**
 * 把一个四位数的四个数字由小至大排序,组成一个新数,
 * 又由大至小排序组成一个新数,
 * 这两个数相减, 之后重复这个步骤, 
 * 只要四位数的四个数字不完全相同(如9999),
 * 数字最终便会变成 6174。
 * 
 * @author Administrator
 * 
 */
public class Demo {
	// 存放4个1位整数
	private static List<Integer> list = new ArrayList<Integer>(4);
	// 每个4位整数转换成6174所需的迭代次数
	private static int count = 0;

	public static void main(String[] args) throws Exception {
		// 把所有可用整数写进文件
		writeAll();
		// 从文件中取出整数
		Set<Integer> set = readFromFile();
		// 打印一下可用整数的个数
		System.out.println(set.size());
		// 统计迭代次数
		Set<Integer> countSet = new HashSet<Integer>();
		// 循环转换各个4位整数
		for (Integer number : set) {
			turnTo6174(number);
			countSet.add(count);
			count = 0;
		}
		// 打印统计的迭代次数
		System.out.println(countSet);
	}

	/**
	 * 把4位整数分割成4个整数,放入list中
	 * 
	 * @param number
	 * @return
	 */
	private static List<Integer> split(int number) {
		list.clear();
		String str = number + "";
		// 4位数反转相减最小为999, 为999时要补一位0以满足4位整数的要求
		if (str.length() == 3) {
			str += "0";
		}
		for (int i = 0; i < 4; i++) {
			int num = str.charAt(i) - 48;
			list.add(num);
		}
		return list;
	}

	/**
	 * 把list中的每个整数组合成一个整数
	 * 
	 * @param list
	 * @return
	 */
	private static int compose(List<Integer> list) {
		StringBuilder sb = new StringBuilder(4);
		for (Integer integer : list) {
			sb.append(integer);
		}
		return Integer.parseInt(sb.toString());
	}

	/**
	 * 升序排序
	 * 
	 * @param list
	 */
	private static void sortToASC(List<Integer> list) {
		Collections.sort(list);
	}

	/**
	 * 降序排序
	 * 
	 * @param list
	 */
	private static void sortToDESC(List<Integer> list) {
		Collections.sort(list, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return -(o1 - o2);
			}
		});
	}

	/**
	 * 1 升序排序, 2 降序排序, 3 相减取绝对值, 4 如果不是6174则继续迭代,如果是则结束迭代
	 * 
	 * @param number
	 * @return
	 */
	private static int turnTo6174(int number) {
		count++;
		sortToASC(split(number));
		int numberASC = compose(list);
		sortToDESC(list);
		int numberDESC = compose(list);
		int exspect = Math.abs(numberASC - numberDESC);
		if (exspect == 6174) {
			return 6174;
		}
		list.clear();
		return turnTo6174(exspect);
	}

	/**
	 * 从文件中解析数字
	 * 
	 * @return
	 * @throws Exception
	 */
	private static Set<Integer> readFromFile() throws Exception {
		Set<Integer> set = new HashSet<Integer>();
		BufferedReader br = new BufferedReader(new FileReader("D:/test.txt"));
		String line = "";
		while ((line = br.readLine()) != null) {
			String[] datas = line.split(" ");
			for (String string : datas) {
				set.add(Integer.parseInt(string));
			}
		}
		return set;
	}

	/**
	 * 把所有4位整数写到文件中
	 * 
	 * @throws Exception
	 */
	private static void writeAll() throws Exception {
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:/test.txt",
				true));
		for (int i = 1000; i < 10000; i++) {
			split(i);
			Set<Integer> set = new HashSet<Integer>(list);
			// 4位整数各个位置不能全部相同
			if (set.size() == 1) {
				continue;
			}
			bw.write(i + " ");
			if ((i + 1) % 10 == 0) {
				bw.write("\n");
			}
		}
		bw.flush();
		bw.close();
	}
}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值