凑平方数
把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721
比如:0, 36, 5948721
再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等...
注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。
分组时,必须用完所有的数字,不能重复,不能遗漏。
如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?
注意:需要提交的是一个整数,不要填写多余内容。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main {
public static ArrayList<char[]>arrayList=new ArrayList<>();
public static long []numbers=new long[10];
public static Set<String>set=new HashSet<>();
public static void main(String[] args) {
char[]s={'0','1','2','3','4','5','6','7','8','9'};
permutaion(s, 0, 9);
for(int i=0;i<arrayList.size();i++){
dfs(0, arrayList.get(i),0);
}
Iterator<String>iterator=set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("总共有:"+set.size());
}
public static void dfs(int current_location,char []current_s,int num){
if(current_location==10){ ///位置0-9已经排列完了
long []current_numbers=new long[num];
current_numbers=Arrays.copyOf(numbers, num);
Arrays.sort(current_numbers);
String temp_string="";
for(long i:current_numbers){
String temp=""+i;
temp_string=temp_string+" "+temp; ///使用空格将其分割开来
}
set.add(temp_string);
return;
}
if(current_s[current_location]=='0'){ ///如果是零,直接跳过
numbers[num]=0;
dfs(current_location+1, current_s,num+1);
}else{
long sum=0; ///使用long防止溢出
for(int i=current_location;i<current_s.length;i++){
sum=sum*10+(int)(current_s[i]-'0');
double temp_sqrt=Math.sqrt(sum);
if(temp_sqrt==(int)temp_sqrt){
numbers[num]=(long)sum;
dfs(i+1, current_s,num+1);
}
}
}
}
///实现全排列
public static void permutaion(char[]s,int from,int to){
if(from==to){
char []temp=Arrays.copyOf(s, s.length);
arrayList.add(temp);
return;
}
for(int i=from;i<=to;i++){
char temp=s[i];
s[i]=s[from];
s[from]=temp;
permutaion(s, from+1, to);
temp=s[i];
s[i]=s[from];
s[from]=temp;
}
}
}