1.猜年龄
暴力枚举。注意题中信息:年龄差不超8岁
public class Main
{
public static void main(String args[])
{
for(int i=1;;i++)
{
for(int j=i+1;j<=i+8;j++)
{
if((i*j)/(i+j)==6 && (i*j)%(i+j)==0)
{System.out.println(i+" "+j);return;}
}
}
}
}
答案:10.
2.李白打酒
搜索+回溯
每一次都面临两种情况,遇花或遇店,选择一种情况往下搜索试探,然后再回溯,试探另一种情况。
回溯也就是return的出口:遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。也就是遇店5次,遇花9次,还剩一斗,结束。也就是flower=5 && house=9 && n=1,return;
public class Main
{
static int cnt=0;
public static void main(String args[])
{
f(2,0,0);
System.out.println(cnt);
}
static void f(int n,int flower,int house)//n为当前酒的斗数,flower为遇花的次数,house为遇店的次数
{
if(house>5||flower>9) return;
if(flower==9&&house==5&&n==1) {
cnt++; return;
}
f(n-1,flower+1,house);
f(2*n,flower,house+1);
}
}
答案:14
3.神奇算式
暴力枚举,把四个数枚举出来,判断成立的情况即可。
public class Main
{
static int cnt=0;
public static void main(String args[])
{
for(int a=1;a<=9;a++)
{
for(int b=0;b<=9;b++)
{
if(b!=a)
for(int c=0;c<=9;c++)
{
if(c!=a&&c!=b)
for(int d=0;d<=9;d++)
{
if(d!=c&&d!=b&&d!=a)
{
int[] temp = {a,b,c,d};
int num1,num2;
if(b!=0) { //第一个数是1位,第二个数是3位,去掉和第一个数是3位,第一个数是1位重复的情况
num1=a;num2=b*100+c*10+d;f(num1,num2,temp);
}
if(c!=0)
{
num1=a*10+b;num2=c*10+d;
if(num1<num2) f(num1,num2,temp); //保证第一个数小于第二个数,去掉交换重复的情况
}
}
}
}
}
}
System.out.println(cnt);
}
static void f(int n1,int n2,int arr[])
{
int s = n1*n2;
if(s<1000) return; //乘积是3位数
int[] temp = new int[4];
int index=0;
while(s>0)
{
temp[index++]=s%10;
s=s/10;
}
java.util.Arrays.sort(arr);
java.util.Arrays.sort(temp);
for(int i=0;i<4;i++)
{
if(arr[i]!=temp[i]) return;
}
cnt++;
System.out.println(n1+" * "+n2+" = "+n1*n2);
}
}
输出:
15 * 93 = 1395
21 * 60 = 1260
21 * 87 = 1827
27 * 81 = 2187
30 * 51 = 1530
3 * 501 = 1503
3 * 510 = 1530
35 * 41 = 1435
6 * 201 = 1206
6 * 210 = 1260
8 * 473 = 3784
9 * 351 = 3159
12
4.写日志
答案:n%3+1
5.锦标赛
6.六角填数
全排列+判断
public class Main
{
public static void main(String args[])
{
int[] a = new int[] {2,4,5,6,7,9,10,11,12};
mySort(a,0);
}
static void mySort(int a[],int k) // 全排列
{
if(k==a.length)
{
if(check(a)) print(a);
return ;
}
for(int i=k;i<a.length;i++)
{
{int t=a[i]; a[i]=a[k]; a[k]=t;}
mySort(a,k+1);
{int t=a[i]; a[i]=a[k]; a[k]=t;}
}
}
static boolean check(int a[]) //判断
{
int n1 = a[0]+a[1]+a[2]+8;
int n2 = 1+a[0]+a[3]+a[5];
if(n1!=n2) return false;
int n3 = 1+a[1]+a[4]+a[8];
if(n2!=n3) return false;
int n4 = a[5]+a[6]+a[7]+a[8];
if(n3!=n4) return false;
int n5 = 8+a[3]+a[6]+3;
if(n4!=n5) return false;
int n6 = a[2]+a[4]+a[7]+3;
if(n5!=n6) return false;
return true;
}
static void print(int a[])
{
for(int x=0;x<a.length;x++)
System.out.print(a[x]+" ");
System.out.println();
}
}
答案:10