黑马程序员技术交流社区
标题:
各位大神,求解~~~
[打印本页]
作者:
yy604235550
时间:
2014-2-24 19:22
标题:
各位大神,求解~~~
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
作者:
李白衣
时间:
2014-2-24 19:23
package itheima.blog;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NumberBlackhole {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> allNumber = new ArrayList<Integer>();
List<Integer> repeatedNumber = new ArrayList<Integer>();
int value = 99887;//指定一个数
while(true){
if(allNumber.contains(value)){
if(repeatedNumber.contains(value))
break;
else
repeatedNumber.add(value);
}
else{
allNumber.add(value);
}
value = nextNumber(toArray(value));
}
System.out.println(allNumber);
/*打印循环圈*/
System.out.println(repeatedNumber);
}
public static int[] toArray(int n){
int arr[]=new int[5];
for(int i=0; i<5; i++){
arr[4-i] = n%10;
n = n/10;
}
return arr;
}
public static int nextNumber(int a[]){
Arrays.sort(a);
String min="";
for(int i=0;i<5;i++){
min=min+String.valueOf(a[i]);
}
int Min=Integer.parseInt(min);
StringBuffer sb = new StringBuffer(min).reverse();
String max = sb.toString();
int Max = Integer.parseInt(max);
return Max-Min;
}
}
复制代码
作者:
syw02014
时间:
2014-2-24 19:42
你这是蓝桥杯(C本科组)的试题,之前参赛前做的练习题有它,直接你代码吧:
#include <stdio.h>
struct
{
int num;
int next;
int node;
}N[100000];
void init()
{
int i;
for(i=0; i<100000;i++)
{
N[i].num=i;
N[i].next=-1;
N[i].node=-1;
}
}
int maxof(int m)
{
int i, t = 0;
int d[10] = {0,0,0,0,0,0,0,0,0,0};
while (m > 0)
{
d[m%10]++;
m/=10;
}
for (i = 9; i >= 0; i --)
while (d[i] > 0)
{
t*= 10;
t += i;
d[i] --;
}
return t;
}
int minof(int m)
{
int i, t = 0;
int d[10] = {0,0,0,0,0,0,0,0,0,0};
while (m > 0)
{
d[m%10]++;
m/=10;
}
for (i = 0; i <= 9; i ++)
while (d[i] > 0)
{
t*= 10;
t += i;
d[i]--;
}
return t;
}
int trans(int m)
{
return (maxof(m)-minof(m));
}
int main()
{
int i,t,k,j,count=0;
init();
for(i = 0;i<100000; i ++)
if(N[i].next== -1)
{
k = i;
do
{
N[k].next = trans(k); //下一个位置
N[k].node = i; //首先由i开始的链
k = trans(k);
}while (N[k].next == -1); //遇到已经处理的节点则结束
if (N[k].node== i) //是首先由i起始的链才是首次发现的圈
{
t = k;
printf("%d: [%d", count++, t);
while (trans(k) != t)
{
k = trans(k);
printf(", %d", k);
N[k].node = 1;
}
printf("]\n");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2