黑马程序员技术交流社区
标题:
再来个难点的怎样?
[打印本页]
作者:
黄方
时间:
2012-2-27 15:10
标题:
再来个难点的怎样?
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,
得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:[82962, 75933, 63954, 61974]其中数字的先后顺序可以不考虑。
作者:
李晓俊老师
时间:
2012-2-27 18:18
真难,没看懂什么意思
作者:
dangfei
时间:
2012-2-27 18:33
package my.test4;
import java.util.ArrayList;
public class Test2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=10000;i<100000;i++)
{
ArrayList list=new ArrayList();
int con=0;
int dif=getDif(i);
while(dif!=i)
{
if(list.contains(dif))
break;//list中存在则跳出
else
list.add(dif);
dif=getDif(dif);
}
if(dif==i)
{
for(int c=0;c<list.size();c++)
System.out.print(list.get(c)+"|");
System.out.print(dif);
System.out.println();
}
}
}
static int getDif(int original)
{//得到最大值与最小值之差
int dif=0;
dif=getMax(original)-getMin(original);
return dif;
}
static int getMax(int original){//得到最大值
int max=0;
int p=0;
char mod;
char[] trs=(original+"").toCharArray();
for(int i=0;i<trs.length-1;i++)
{
p=i;
for(int k=i+1;k<trs.length;k++)
{
if(trs[k]>trs[p])
p=k;
}
if(p!=i)
{
mod=trs[p];
trs[p]=trs[i];
trs[i]=mod;
}
}
String str=new String(trs);
max=Integer.parseInt(str);
return max;
}
static int getMin(int original){//得到最小值
int min=0;
int p=0;
char mod;
char[] trs=(original+"").toCharArray();
for(int i=0;i<trs.length-1;i++)
{
p=i;
for(int k=i+1;k<trs.length;k++)
{
if(trs[k]<trs[p])
p=k;
}
if(p!=i)
{
mod=trs[p];
trs[p]=trs[i];
trs[i]=mod;
}
}
String str=new String(trs);
min=Integer.parseInt(str);
return min;
}
}
复制代码
返回结果为:
59994|53955
53955|59994
82962|75933|63954|61974
71973|83952|74943|62964
61974|82962|75933|63954
83952|74943|62964|71973
62964|71973|83952|74943
63954|61974|82962|75933
75933|63954|61974|82962
74943|62964|71973|83952
并且测试了最大循环次数为9次,说明 5位数中
最多循环9此便能得到它本身或者(与它本身运算得到的值相等)
作者:
张建银
时间:
2012-2-28 22:00
public class SortText
{
public static void main(String[] args)
{
for(int i=10000;i<100000;i++){
Integer ceshi=(Integer)i;
demo(ceshi.toString());
}
List<String> list=new ArrayList<String>();
for(String st1:set){
list.add(st1);
}
System.out.println(list+"这些数都是能构成数字黑洞的循环数"+"+发现一个规律:10000--100000之间的5位数正反两次循环排序差"都是这个集合里面的数");
}
public static void demo(String str1)
{
String a=str1;
Integer v=sortText(a,4);
String str4=sb2.toString();
v=sortText(a,5);
String v1=v.toString();
if(str4.contains(v1)&&sb2.length()>30){
sortText(a,4);
String hj=sb2.substring(6, 11);
set.add(hj);
}
}
static HashSet<String> set=new HashSet<String>();
static StringBuilder sb2=new StringBuilder();
static StringBuilder sb1=new StringBuilder();
static int j=0;
public static int sortText(String str,int a){
if(a==4|a==5){sb2.delete(0, sb2.length());sb2.append(str+",");}
for(int i=0;i<a;i++){
char[] ch=str.toCharArray();
if(ch.length ==5){
Arrays.sort(ch);
sb1.append(ch);
String min=sb1.toString();
String max=sb1.reverse().toString();
sb1.delete(0, sb1.length());
Integer distance=(Integer)(Integer.parseInt(max)-Integer.parseInt(min));
j=distance;
String dis=distance.toString();
str=dis;
if(dis.toCharArray().length==5){
sb2.append(j+",") ;}
}
}
return j;
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2