1 题目:求一个9位数,这个数由 1 ,2,3,4,5,6,7,8,9 组成,且数字不能重复,使得这个数的第一位能被 1 整除,前两位数能被 2 整除,前三位数能被 3 整除,以此类推,一直到整个九位数能被 9 整除。
2 解题思路:
思路1:暴力求解,从1123456789到999999999循环,分别计算前2位是否能被2整除,前3位是否能被3整除…,如果能继续,不能则退出,进入下一个循环;感觉这种方法效率太低。
思路2:用1到9个数组成一个数组{1,2,3,4,5,6,7,8,9},分别从数组中取出元素,组成符合需要的1位数,2位数…9位数,并进行循环匹配,最后得出所需要的数;笔者用此法解,并附上代码。
思路3:根据一些数学常识,进行推理,如被2整除,被3整除等等的规律进行推理,最后算出结果。
3 java代码
import java.util.Arrays;
public class UniqueSolution {
static boolean pr=false;//true 打印测试日志
public static void main(String[] args){
int[] arrayInt={1,2,3,4,5,6,7,8,9};
int resultNum=computerUniqueNumber(arrayInt);
if (Integer.valueOf(resultNum).equals(0)){
System.out.println("未找到题目所要求的数");
} else System.out.println("题目的答案是:" + resultNum);
}
static int computerUniqueNumber(int[] arrayInt){
int times=0;//用于记录循环次数
int[] newArray=arrayInt.clone();//用做数组中转
int sizeNewArray=newArray.length; //中转数组长度
int iLoop=sizeNewArray;//循环次数
int[] iArray=newArray.clone();//循环数组
int resultNum=0;//用于记录所求数字
for (int i=0;i<iLoop;i++){
times++;
if (pr) {
System.out.println("**********************************");
}
if (pr) {
System.out.println("i:" + i);
}
iArray=arrayInt.clone();
//前一位数
int[] arrayFront1 = new int[1];
arrayFront1[0]=iArray[i];
int intFront1 = arrayToInt(arrayFront1);
int modFront1=intFront1%1;
if (modFront1==0){
if (pr) {
System.out.println("intFront1:" + intFront1);
}
//清除第一个数字
iArray[i]=0;//用过的数字置为0,做标记;
newArray=arrayDeleteZero(iArray);//剔除0元素,生成新的数组
iArray=newArray;//赋新值,清除0,供下一级循环使用
sizeNewArray=newArray.length;//剔除非0元素后数组的长度
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int jLoop=sizeNewArray;
int[] jArray=iArray.clone();
for (int j=0;j<jLoop;j++){
times++;
if (pr) {
System.out.println("j:" + j);
}
jArray=iArray.clone();
//前二位数
int[] arrayFront2=new int[2];
arrayFront2=arrayNext(arrayFront1,2,jArray[j]);
int intFront2=arrayToInt(arrayFront2);
int modFront2=intFront2%2;
if (modFront2==0){
if (pr) {
System.out.println("intFront2:" + intFront2);
}
//清除第二个数字
jArray[j]=0;
newArray=arrayDeleteZero(jArray);
jArray=newArray;
sizeNewArray=newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int kLoop=sizeNewArray;
int[] kArray=newArray.clone();
for (int k=0;k<kLoop;k++) {
times++;
if (pr) {
System.out.println("k:" + k);
}
kArray=jArray.clone();
//前三位数
int[] arrayFront3 = new int[3];
arrayFront3=arrayNext(arrayFront2,3,kArray[k]);
int intFront3 = arrayToInt(arrayFront3);
int modFront3=intFront3%3;
if (modFront3==0){
if (pr) {
System.out.println("intFront3:" + intFront3);
}
//清除第三个数字
kArray[k]=0;
newArray=arrayDeleteZero(kArray);
kArray=newArray;
sizeNewArray=newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int lLoop=sizeNewArray;
int[] lArray=newArray.clone();
for (int l=0;l<lLoop;l++) {
times++;
if (pr) {
System.out.println("l:" + l);
}
lArray=kArray.clone();
//前四位数
int[] arrayFront4 = new int[4];
arrayFront4=arrayNext(arrayFront3,4,lArray[l]);
int intFront4 = arrayToInt(arrayFront4);
int modFront4 = intFront4 % 4;
if (modFront4 == 0) {
if (pr) {
System.out.println("intFront4:" + intFront4);
}
//清除第四个数字
lArray[l]=0;
newArray=arrayDeleteZero(lArray);
lArray=newArray;
sizeNewArray=newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int mLoop=sizeNewArray;
int[] mArray=newArray.clone();
for (int m=0;m<mLoop;m++) {
times++;
if (pr) {
System.out.println("m:" + m);
}
mArray=lArray.clone();
//前五位数
int[] arrayFront5 = new int[5];
arrayFront5=arrayNext(arrayFront4,5,mArray[m]);
int intFront5 = arrayToInt(arrayFront5);
int modFront5 = intFront5 % 5;
if (modFront5 == 0) {
if (pr) {
System.out.println("intFront5:" + intFront5);
}
//清除第五个数字
mArray[m] = 0;
newArray = arrayDeleteZero(mArray);
mArray=newArray;
sizeNewArray = newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int nLoop=sizeNewArray;
int[] nArray=newArray.clone();
for (int n=0;n<nLoop;n++) {
times++;
if (pr) {
System.out.println("n:" + n);
}
nArray=mArray.clone();
前六位数
int[] arrayFront6 = new int[6];
arrayFront6=arrayNext(arrayFront5,6,nArray[n]);
int intFront6 = arrayToInt(arrayFront6);
int modFront6 = intFront6 % 6;
if (modFront6 == 0) {
if (pr) {
System.out.println("intFront6:" + intFront6);
}
//清除第六个数字
nArray[n] = 0;
newArray = arrayDeleteZero(nArray);
nArray=newArray;
sizeNewArray = newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int oLoop=sizeNewArray;
int[] oArray=newArray.clone();
for (int o=0;o<oLoop;o++) {
times++;
if (pr) {
System.out.println("o:" + o);
}
oArray=nArray.clone();
//前七位数
int[] arrayFront7 = new int[7];
arrayFront7=arrayNext(arrayFront6,7,oArray[o]);
int intFront7 = arrayToInt(arrayFront7);
int modFront7 = intFront7 % 7;
if (modFront7 == 0) {
if (pr) {
System.out.println("intFront7:" + intFront7);
}
//清除第七个数字
oArray[o] = 0;
newArray = arrayDeleteZero(oArray);
oArray=newArray;
sizeNewArray = newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int pLoop=sizeNewArray;
int[] pArray=newArray.clone();
for (int p=0;p<pLoop;p++) {
times++;
if (pr) {
System.out.println("p:" + p);
}
pArray=oArray.clone();
//前八位数
int[] arrayFront8 = new int[8];
arrayFront8=arrayNext(arrayFront7,8,pArray[p]);
int intFront8 = arrayToInt(arrayFront8);
int modFront8 = intFront8 % 8;
if (modFront8 == 0) {
if (pr) {
System.out.println("intFront8:" + intFront8);
}
//清除第八个数字
pArray[p] = 0;
newArray = arrayDeleteZero(pArray);
pArray=newArray;
sizeNewArray = newArray.length;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
int qLoop=sizeNewArray;
int[] qArray=newArray.clone();
for (int q=0;q<qLoop;q++) {
times++;
if (pr) {
System.out.println("q:" + q);
}
qArray=pArray.clone();
//前九位数
int[] arrayFront9 = new int[9];
arrayFront9=arrayNext(arrayFront8,9,qArray[q]);
int intFront9 = arrayToInt(arrayFront9);
int modFront9 = intFront9 % 9;
if (modFront9 == 0) {
resultNum=intFront9;
if (pr) {
System.out.println("newArray:" + Arrays.toString(newArray));
}
if (pr) {
System.out.println("sizeNewArray:" + sizeNewArray);
}
}//if q modFront9
} //for q
}//if p modFront8
} //for p
}//if o modFront7
} //for o
}//if n modFront6
} //for n
}//if m modFront5
} //for m
}//if l modFront4
} // for l
} //if modFront3
}// for k
}//if modFront2
}//for j
}// if modFront1
}//for i
System.out.println("循环的次数:"+times);
return resultNum;
}
//数组转数字
static int arrayToInt(int[] arrayInt){
String strNum="";
for (int num : arrayInt) {
strNum=strNum+Integer.toString(num);
}
int intNum=Integer.parseInt(strNum);
return intNum;
}
//剔除非零元素,生成新的数组
static int[] arrayDeleteZero(int[] arrayInt){
int i=0;
int sizeArrayInt=arrayInt.length;
for (int num : arrayInt) {
if (num==0){
i++;
}
}
//计算新数组长度
int sizeArrayIntNew=sizeArrayInt-i;
int[] arrayIntNew=new int[sizeArrayIntNew];
int j=0;
for (int k=0;k<sizeArrayInt;k++){
if (arrayInt[k]==0){
j++;
} else {
arrayIntNew[k-j]=arrayInt[k];
}
}
return arrayIntNew;
}
//生成下一个数组
static int[] arrayNext(int[] arrayPrior,int sizeNextArray,int num){
int[] nextArray=new int[sizeNextArray];
for (int i=0;i<arrayPrior.length;i++){
nextArray[i]=arrayPrior[i];
}
nextArray[sizeNextArray-1]=num;
return nextArray;
}
}
4运行结果