代码如下:
package com.javase.test;
/**
* @author jt
*2015-10-21 下午5:14:46
*
*/
//一个人岁数的3次方是四位数,四次方是六位数,并知道此人岁数的3次方和4次方用遍了0--9十个数字,
//请编程写程序求此人的岁数
//程序构思:采用缩小范围法来求解
public class Age {
/**
* @param args
*/
public static void main(String[] args) {
for(int i=1023;i<=9876;i++)//从这些数中找寻数字
{ for(int j=10;j<=100;j++)//从岁数中找寻数
{
if(j*j*j==i)//逐一判断岁数的3次方是否在这些四位数中
{
for(int k=10234;k<=987654;k++)//从这些6位数中逐一找
{ //for(int m=1;m<j;m++)
if(j*j*j*j==k)//岁数的4次方是否在这些6位数中
{ //System.out.println("i="+i+" j="+j);
//System.out.println("k="+k+" m="+j);
int a1,a2,a3,a4;
int b1,b2,b3,b4,b5,b6;
//3次方的4位数a1a2a34,逐一求出每位数
a1=i/1000;
a2=(i%1000)/100;
a3=((i%1000)%100)/10;
a4=(((i%1000)%100)%10)/1;
//4次方的6位数b1b2b3b4b5b6,逐一求出每位数
b1=k/100000;
b2=(k%100000)/10000;
b3=((k%100000)%10000)/1000;
b4=(((k%100000)%10000)%1000)/100;
b5=((((k%100000)%10000)%1000)%100)/10;
b6=(((((k%100000)%10000)%1000)%100)%10)/1;
//System.out.println(a1+" "+ a2 +" "+a3+" "+a4);
//判断4位数每位数不相等
if((a1!=a2)&&(a1!=a3)&&(a1!=a4)&&(a2!=a3)&&(a2!=a4)&&(a3!=a4))
{ //System.out.println("!!"+"+i="+i+ " j="+j);
//判断6位数每位数不能相等
if((b1!=b2)&&(b1!=b3)&&(b1!=b4)&&(b1!=b5)&&(b1!=b6)
&&(b2!=b3)&&(b2!=b4)&&(b2!=b5)&&(b2!=b6)
&&(b3!=b4)&&(b4!=b5)&&(b3!=b6)
&&(b4!=b5)&&(b4!=b6)
&&(b5!=b6))
//判断4位数中的每位数不和6位数中的每位数相等
if((a1!=b1)&&(a1!=b2)&&(a1!=b3)&&(a1!=b4)&&(a1!=b5)&&(a1!=b6)
&&(a2!=b1)&&(a2!=b2)&&(a2!=b3)&&(a2!=b4)&&(a2!=b5)&&(a2!=b6)
&&(a3!=b1)&&(a3!=b2)&&(a3!=b3)&&(a3!=b4)&&(a3!=b5)&&(a3!=b6)
&&(a4!=b1)&&(a4!=b2)&&(a4!=b3)&&(a4!=b4)&&(a4!=b5)&&(a4!=b6))
System.out.println("岁数的3次方为"+"i="+i+" 岁数为:j="+j+" 岁数的4次方为:k="+k+" 位数为: m="+j);
}
}
}
}
}
}
}
}
很显然上面的代码阅读起来困难,而且不繁杂,下面是代码的优化
思路:把int转化为字符串string类型
package com.javase.test;
/**
* @author jt
*2015-10-21 下午6:55:42
*
*/
//代码优化
public class Age1 {
/**
* @param args
*/
public static void main(String[] args) {
double x;
for(int i=1023;i<=9876;i++)
{
x=Math.cbrt(i);//开立方根
if((int)x==x)//判断开出来的立方根是否为整数,岁数去整数,整数留下来,不是整数去掉
{
//System.out.println("x="+x+" i="+i);//(11--21)
if(x*x*x*x>100000&&x*x*x*x<999999)//判断岁数的4次方在100000到999999之间
{
//System.out.println("x="+x+" i="+i+" n="+x*x*x*x);//(18--21)
double m=i;//岁数的3次方
double n=x*x*x*x;//岁数的4次方
//将int型数据转化为字符串的形式
String str1=i+"";
//System.out.println(str1);
String str2=(int)n+"";
//System.out.println(str2);
boolean flag1=false,flag2=false,flag3=false;
//判断4位数是否有相同的字符
for(int h=0;h<str1.length();h++)
for(int k=h+1;k<str1.length();k++)
if(str1.charAt(h)==str1.charAt(k))
flag1=true;
//判断6位数是否有相同的字符
for(int h=0;h<str2.length();h++)
for(int k=h+1;k<str2.length();k++)
if(str2.charAt(h)==str2.charAt(k))
flag2=true;
//判断4位数和6位数是否有相同的字符
for(int h=0;h<str1.length();h++)
for(int k=0;k<str2.length();k++)
if(str1.charAt(h)==str2.charAt(k))
flag3=true;
//如果他们都没有相同的字符,则满足条件
if(!flag1&&!flag2&&!flag3)
System.out.println("x="+x+" str1="+str1+" str2="+str2);
}
}
}
}
}
求出来,岁数为18岁