给一个数串 例如 :31123314 这个串可以表示成 31123314 (^_^ 还是一样的)它表示上面的那个串中有 3个1,1个2,3个3,一个4;再举一个不同的。5553141 这个串可以表示为 21131435 (2个1,1个3,1个4,3个5),21131435就是5553141的Inventory 数。
对给出的数,求出他的Inventory 数,如果是本身,那么就输出: n is self-inventorying(n 表示所给的数串) 如果不一样那么继续向下变换,还是那5553141 举例吧! 他变成21131435 ,然后可以变成 3112231415,再变就成 3122231415 就这样变下去;如果在某一步中变成了初始串 那就输出:n is self-inventorying after j steps (j 是变了多少步才等于他自己);如果出现在某一步变换中出现了循环那么就输出:n enters an inventory loop of length k(k 是循环的周期)如果变换了15次还没有上面说的情况那么就输出:n can not be classified after 15 iterations
程序:
import java.util.*;
import java.io.*;
public class Main{
public static void main(String rgs[]) throws Exception
{
Scanner cin = new Scanner(new BufferedInputStream(System.in));
while(true){
String s = cin.next();
if(s.equals("-1"))
break;
String[] t = new String[16];//保存s与15个变换结果
int i;
t[0]=s;
for(i=0;i<15;i++){
t[i+1] = change(t[i]);
int res = Judge (t,i+1); //判断
if(res==1 && i==0){
System.out.println(s+" is self-inventorying ");
break;
}
if(res==1){
System.out.println(s+" is self-inventorying after "+i+" steps ");
break;
}
if(res>0){
System.out.println(s+" enters an inventory loop of length "+res+" ");
break;
}
}
if(i==15)
System.out.println(s+" can not be classified after 15 iterations ");
}
}
//输出s的Inventory 数,输入5553141则输出21131435
public static String change(String s){
int i,n=s.length();
int[] count=new int[10];
String t="";
Arrays.fill(count,0);
for(i=0;i< n;i++)
count[s.charAt(i)-'0']++;
for(i=0;i< 10;i++){
if(count[i]>0)
t+=String.valueOf(count[i])+String.valueOf(i);
}
return t;
}
//第ind次变换结果与前面所有结果比较
public static int Judge(String[] t,int ind){
for(int i=0;i< ind;i++){
if(t[ind].equals(t[i])){
if(ind==i+1)
return 1;
else
return ind-i;
}
}
return 0;
}
}
运行结果:
C:\poj>java Main
22
22 is self-inventorying
31123314
31123314 is self-inventorying
314213241519
314213241519 enters an inventory loop of length 2
21221314
21221314 is self-inventorying after 2 steps
111222234459
111222234459 enters an inventory loop of length 2