这里我只说四位数的数字黑洞6147
把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。
大概是这样去理解,是给出一个四位数,然后将这个数里面的数字重新排列求出最大值和最小值,然后相减掉直到到达6147,你会发现不管你输入的只要是四位不相同的数字那么最后结果也会是6174
那么我们该怎么重排列一个数字呢,我们可以将这个四位数转换成字符串在对每一个字符进行操作即可
String s = n+"";
char c[] = s.toCharArray();
这样就成了一个字符数组了,我们只需要对这个字符数组排序就可以了
我们调用Arrays.sort()给字符数组排序,得到的是从小到大
之后我们可以定义一个最小值变量min来保存每一次的四位数重排列后的最小值
怎么做?因为字符数组是排序好的,那么将字符数组转换出整型即可了
求最大值就是从字符数组尾部遍历即可
实现代码
/*
* @ly
* Java中的字符串与数值转化
* 把一个四位数的四个数字由小至大排列,组成一个新数,又由大至小排列排列组成一个新数,
* 这两个数相减,之后重复这个步骤,只要四位数的四个数字不重复,数字最终便会变成 6174。
*/
import java.util.*;
public class Test3 {
public static void main(String[] args) {
System.out.print("请输入一个四位数字:");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
while(true)
{
//首先将这个四位数转化成字符数组
String s = n+"";
char c[] = s.toCharArray();
//然后对其重排列求出最大值最小值,我们通过
Arrays.sort(c); //对数组的字符进行由低到高的排序
int min = 0;
int max = 0;
for(int i = 0;i<c.length;i++)
{
min = min*10+c[i]-'0';
}
// System.out.println(min);
for(int i = c.length-1;i>=0;i--)
{
max = max*10+c[i]-'0';
}
// System.out.println(max);
int n2 = (max - min);
if(n2 == n) break; //找到了四位数字黑洞6147
n = n2;
System.out.println(n);
}
}
}
定义n2是为了判断是否到达了6147,到达6174后会一直循环所以像黑洞一样。
扫描二维码关注公众号,回复:
2787660 查看本文章
大概结果
我是找到6174后结束了循环,大家也可以试试循环不结束是不是出现6174的死循环。
那么三位数的数字黑洞也可以用同样的方法解决。
在这里简介一下在Java中字符串转化为数值的不使用Integer.paresInt()这个方法
我们首先可以提取出字符串中每一个字符然后通过对每一个字符减掉‘0’的ASCALL码值,这样就可以的到对应的数字了
代码:
String s = "5368";
int n = 0 ;
for(int i = 0;i<s.length();i++)
{
// n =n*10+ s.charAt(i)-'0'; //'0'表示用每一个字符串中的字符与ASCALL码值相减后的ASCALL码值
n = Integer.parseInt(s);
System.out.println(n);
}*/
最近在学习字符串的操作,感觉java比c、c++的类库强大许多,很多现成的都能使用