黑马程序员技术交流社区

标题: 下午个么给看的题目,摸索了半天不会,求破解 [打印本页]

作者: 王飞    时间: 2012-7-21 21:20
标题: 下午个么给看的题目,摸索了半天不会,求破解
本帖最后由 王飞 于 2012-7-21 23:39 编辑

题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。
例如:153是一个 "水仙花数 ",因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
作者: 蒋映辉    时间: 2012-7-21 21:26
public class Test1
{
  public static void main(String[] args)
{
          
          
          for(int i=100;i<999;i++){
                  int temp=i;
                  int a=temp%10;
                  temp/=10;
                  int b=temp%10;
                  temp/=10;
                  int c=temp%10;
                  if(a*a*a+b*b*b+c*c*c==i) System.out.println(i);
                 
                  
          }
}
}
作者: 程潇    时间: 2012-7-21 21:42
本帖最后由 程潇 于 2012-7-22 11:16 编辑

首先可以确定,这是一个三位数,那么百位的x的取值范围必然是1~9,十位和个位则是0~9.
确定了三个数的范围,就可以做一个三层的for循环
其实我们这里要解的是一个三元一次方程,100*x+10*y+z=x*x*x+y*y*y+z*z*z
通过for循环,就是不断的去试x、y、z的取值是否满足这个方程,如果满足就将结果打印出来。

public class ShuiXianHua {
        
        public static void main(String[] args) {
                for(int x=1; x<=9; x++)
                        for(int y=0; y<=9; y++)
                                for(int z=0; z<=9; z++){
                                        int num = 100*x+10*y+z;
                                        if(num==(x*x*x+y*y*y+z*z*z))
                                                System.out.print(num+" ");
                                }
        }

}


运算结果:
153 370 371 407

作者: 王飞    时间: 2012-7-21 21:49
程潇 发表于 2012-7-21 21:42
public class ShuiXianHua {
       
        public static void main(String[] args) {

求解释。。。
作者: 程潇    时间: 2012-7-21 22:04
王飞 发表于 2012-7-21 21:49
求解释。。。

首先可以确定,这是一个三位数,那么百位的x的取值范围必然是1~9,十位和个位则是0~9.
确定了三个数的范围,就可以做一个三层的for循环
其实我们这里要解的是一个三元一次方程,100*x+10*y+z=x*x*x+y*y*y+z*z*z
通过for循环,就是不断的去试x、y、z的取值是否满足这个方程,如果满足就将结果打印出来。
这个方法如果人来手算的话很慢,但是让计算机做,很快就出来了
作者: 王飞    时间: 2012-7-21 22:05
程潇 发表于 2012-7-21 22:04
首先可以确定,这是一个三位数,那么百位的x的取值范围必然是1~9,十位和个位则是0~9.
确定了三个数的范 ...

谢谢。。。
作者: 程潇    时间: 2012-7-21 22:11
王飞 发表于 2012-7-21 22:05
谢谢。。。

其实版主的思路也不错,你也可以好好看一下
作者: 王飞    时间: 2012-7-21 22:30
蒋映辉 发表于 2012-7-21 21:26
public class Test1
{
  public static void main(String[] args)

个么
我的也符合水仙数的规则,但是为什么和你们的不一样额、、、


求赐教啊、、、



public class aa {
       

    public static void main(String[] args)
    {
            String s = null;
           
    //下面的三个for表示三个位数,第一位不能为零,后面两位可以为零。
           
            for(int a = 1;a<10;a++)   //第一位
            {
                    for(int b = 0;b<10;b++) //第二位
                {
                            for(int c = 0;c<10;c++)  //第三位
                        {
                                s =""+a+b+c;   //把三位数的组合变成字符串
                                if(((int)Math.pow(a, 3)+""+(int)Math.pow(b, 3)+(int)Math.pow(c, 3)).equals(s))
                                {
                                        //这里判断的是a的三次+b的三次+c的三次的字符串如果是s(a+b+c的字符串),那么就符合条件即:其各位数字立方和等于该数本身。
                                        System.out.println(s);
                                }
                        }
                }
            }
    }
             
}


未命名.jpg (7.41 KB, 下载次数: 16)

未命名.jpg

作者: 程潇    时间: 2012-7-21 22:41
王飞 发表于 2012-7-21 22:30
个么
我的也符合水仙数的规则,但是为什么和你们的不一样额、、、

if(((int)Math.pow(a, 3)+""+(int)Math.pow(b, 3)+(int)Math.pow(c, 3)).equals(s)) //这句有问题
//你认为(int)Math.pow(a, 3),
(int)Math.pow(b, 3), (int)Math.pow(c, 3)分别是百位、十位、个位上的数字吧?这里的三个值分别是循环中a、b、c的立方值

作者: 蒋映辉    时间: 2012-7-21 22:44
王飞 发表于 2012-7-21 22:30
个么
我的也符合水仙数的规则,但是为什么和你们的不一样额、、、

真心不想改这些代码  你弄连个字符串在那搞半天我就不知道有啥意思.....
下面的对了
public class Test1 {
   

    public static void main(String[] args)
    {
            String s = null;
            
    //下面的三个for表示三个位数,第一位不能为零,后面两位可以为零。
            
            for(int a = 1;a<10;a++)   //第一位
            {
                    for(int b = 0;b<10;b++) //第二位
                {
                            for(int c = 0;c<10;c++)  //第三位
                        {
                                s =""+a+b+c;   //把三位数的组合变成字符串
                               // System.out.println(s);
                                int ss=Integer.parseInt(s);
                                 int res=(int)Math.pow(a, 3)+(int)Math.pow(b, 3)+(int)Math.pow(c, 3);
                                if(res==ss)
                                {
                                        //这里判断的是a的三次+b的三次+c的三次的字符串如果是s(a+b+c的字符串),那么就符合条件即:其各位数字立方和等于该数本身。
                                        System.out.println(ss+"  "+res);
                                }
                        }
                }
            }
    }
            
}


作者: 张世威    时间: 2012-7-21 22:45
public static void main(String[] args) {
                for(int i=100;i<999;i++){
                        int a=i/100;
                        int b=(i%100)/10;
                        int c=(i%10);
                        if((a*a*a+b*b*b+c*c*c)==i){
                                System.out.println(i+"="+a+"*"+a+"*"+a+" + "
                                                +b+"*"+b+"*"+b+" + "+c+"*"+c+"*"+c);
                        }
                }       
        }

1、求余数
   ①一个三位数 %100,就剩下个位数而后十位数了,例如521,除100的余数就是21;
   ②一个二位数%10,就剩下个位数了,例如21%10,等于1
   ③一个一位数%1,就剩下0了,例如 1%1=0;

2、整除:
   ①一个三位数除以100,即521/100,得百位上面的数字5
   ②一个二位数除以10, 即21/10,得十位上面的数2
  ③一个一位数除以1,得到个位数字,1/1=1;

   
作者: 高正新    时间: 2012-7-21 23:10
王飞 发表于 2012-7-21 22:30
个么
我的也符合水仙数的规则,但是为什么和你们的不一样额、、、


if(((int)Math.pow(a, 3)+""+(int)Math.pow(b, 3)+(int)Math.pow(c, 3)).equals(s))
替换为
int temp = ((int)Math.pow(a, 3)+(int)Math.pow(b, 3)+(int)Math.pow(c, 3));
                                         if((temp+"").equals(s))

换成这样,就可以得出结果了。
还是类型转换没有转换好。。
作者: 王龙彪    时间: 2012-7-21 23:11
本帖最后由 王龙彪 于 2012-7-21 23:20 编辑
  1. public class ShuiXianTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int first, second, third;
  6.                 for(int start = 100; start < 1000; ++start)
  7.                 {
  8.                                 first = start / 100;//取第 1 位
  9.                                 second = (start - first * 100) / 10;//取第 2 位
  10.                                 third = start - first * 100 - second *10;//取第 3 位
  11.                                 
  12.                                 if(start == Math.pow(first, 3) + Math.pow(second, 3) + Math.pow(third, 3))
  13.                                          System.out.println("出现水仙花:" + start);
  14.                 }
  15.         }
  16. }
复制代码

作者: 王龙彪    时间: 2012-7-21 23:13
出现水仙花:153
出现水仙花:370
出现水仙花:371
出现水仙花:407

和楼主结果一样吗
作者: 张莹莹    时间: 2012-7-21 23:49
1.思路及代码见Daffodil.png
2.结果见result.png
3.其实还可以更复杂一点,除了3位的水仙花数,还有更高位数的,我们可以多交流,这个前年的全国软件大赛中出过这个题目

Daffodil.png (23.17 KB, 下载次数: 36)

水仙花数

水仙花数

result.png (1.42 KB, 下载次数: 42)

运行结果

运行结果





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2