面试题1:一个人岁数的3次方是四位数,四次方是六位数,并知道此人岁数的3次方和4次方用遍了0--9十个数字,请编程写程序求此人的岁数

代码如下:

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岁

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值