黑马程序员技术交流社区

标题: 每天一题坚持一个月....之二 [打印本页]

作者: 刘胜寒    时间: 2013-4-9 10:42
标题: 每天一题坚持一个月....之二
C语言里有个很著名的问题叫做水仙花数。水仙花数是一个三位数,它的各位数字的立方相加后等于该数字。多么美丽的数字啊!
可是Large发现这个世界上不仅仅有水仙花,正如整数不仅仅只有三位数一样。
Large经过仔细研究,发现有很多花比水仙花数更优美,我们现在做出如下定义:
班花数:它是一个四位数,各位数字的四次方相加后等于该数。
级花数:它是一个五位数,各位数字的五次方相加后等于该数。
校花数:它是一个六位数,各位数字的六次方相加后等于该数。
我们的任务就是,对于输入的一个整数,判断它是上述数的哪一种。

输入


包含多组数据,第K组数据格式如下:
第K行:每行包括一个正整数N(100<N<1000000)


每组数据输出一行,第K组数据格式如下:
第K行:每行包括一个单词或词组,由对应的输入数字确定,其内容如下

如果该数是水仙花数,输出Daffodil(只输出大写字母)
如果该数是班花数,输出Class Flower
如果该数是级花数,输出Grade Flower
如果该数是校花数,输出Oh~
如果该数不满足任何一个定义,输出一个Nothing
样例输入

153
12345
样例输出

D
N

要注意效率.....
代码中不见建议使用for语句暴力求解....
如果数据量很大的话...
很耗时...
作者: 邵震    时间: 2013-4-9 10:58
不用for用啥啊...if? while?switch?.....
作者: chensc    时间: 2013-4-9 11:07
学习学习!
作者: 黄玉昆    时间: 2013-4-9 11:29
其实“让我们技术起飞吧”这个帖子是一个很好地平台,你可以在这里出题答题,希望你加入支持的队伍来,还有技术分哦
http://bbs.itheima.com/thread-43374-1-1.html
作者: 梁航斌    时间: 2013-4-9 11:35
本帖最后由 梁航斌 于 2013-4-9 11:38 编辑

可以试着先把1到9的X次方先求出然后装到一个容器里,到时候直接取出相加然后判断,软件大赛里出过类似的题目
作者: 陈圳    时间: 2013-4-9 11:38
本帖最后由 陈圳 于 2013-4-9 11:39 编辑
  1. public class NarcissusNums {
  2.         //多位水仙数
  3.         public static void main(String[] args) {
  4.                 judge(153);//我只记得这个水仙数所以加入3位的水仙测试
  5.         }
  6.         public static void judge(Integer num){
  7.                 char[] nums=num.toString().toCharArray();
  8.                 int sum=0,i=nums.length;
  9.                 for(char c:nums)
  10.                         sum+=Math.pow((c-48),i);
  11.                 if(sum!=num)
  12.                         System.out.println("Nothing!");
  13.                 else {
  14.                                 switch(i){
  15.                                 case 3:
  16.                                         System.out.println("三位水仙数,测试!");break;
  17.                                 case 4:
  18.                                         System.out.println("Class Flower"+Arrays.toString(nums));
  19.                                         break;
  20.                                 case 5:
  21.                                         System.out.println("Grade Flower"+Arrays.toString(nums));
  22.                                         break;
  23.                                 case 6:
  24.                                         System.out.println("Oh~"+Arrays.toString(nums));
  25.                                         break;
  26.                                 default:System.out.println("输入的位数不符合");break;
  27.                         }
  28.                 }
  29.         }
  30. }
  31. //pow 方法可以自己写,但是为了省事就不写了。还有 12345它是水仙数吗?不是吧,
复制代码

作者: 刘胜寒    时间: 2013-4-9 12:40
黄玉昆 发表于 2013-4-9 11:29
其实“让我们技术起飞吧”这个帖子是一个很好地平台,你可以在这里出题答题,希望你加入支持的队伍来,还有 ...

我在里面发了贴....灌水的太多...了....
后来就没进去发帖了...
作者: 刘胜寒    时间: 2013-4-9 12:40
梁航斌 发表于 2013-4-9 11:35
可以试着先把1到9的X次方先求出然后装到一个容器里,到时候直接取出相加然后判断,软件大赛里出过类似的题 ...

哥们说得对....看好你...
作者: 梁航斌    时间: 2013-4-9 12:42
似水像火 发表于 2013-4-9 12:40
哥们说得对....看好你...

类似的题目看过一点啦{:3_59:}
作者: 刘胜寒    时间: 2013-4-9 12:51
梁航斌 发表于 2013-4-9 12:42
类似的题目看过一点啦

就是打表....
一种高效的想法....
作者: 谢达    时间: 2013-4-9 19:19
//下面是我的代码,不足的地方希望给点建议,
public enum BeautyNums {
       
        //水仙花
        Daffodil(3),  
        //班花数
        ClassFlower(4),
        //级花数
        GradeFlower(5),
        //校花数
        Oh(6);
       
        private Map<Integer,Double> nums = new HashMap<Integer,Double>();
        //参数代表1-9的几次方
               BeautyNums(int num){
               
                for(int i=0;i<9;i++){
                        nums.put(i, Math.pow(i,num));  //将个花的计算(1-9)的次方一次存放在map集合中
                }
        }
       
        public Double getNum(int num){
                return this.nums.get(num);
        }
}

public class NumTest {
       
        public static void main(String[] args) throws IOException {
                NumTest nt = new NumTest();
                System.out.println("请输入正整数N(100<N<1000000)");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                StringBuilder sb = new StringBuilder();
                int [] nums; //存储输入数字
                int count=0; //统计输入的数字数量
                String line;
               
                while(!("over".equals(line=br.readLine()))){
                        sb.append(line+" ");
                        count++;
                }
                nums = new int[count];
                String [] ns = sb.toString().split(" ");
                for(int i =0;i<ns.length;i++){
                        nums[i]=Integer.valueOf(ns[i]);
                        if(nums[i]<100 ||nums[i]>1000000)
                                throw new RuntimeException("您输入的数字已超出范围");
                        System.out.println(nt.calName(nums[i]));;
                       
                }
                               
        }
                               
       
        //计算num的类型
        public String calName(int num){
                String numName = "numName: ";
                char [] c ={'b','q','w','s'}; //'b'--3位数  'q'--四位数 'w'--代表五位数 's'--代表六位数
                //将整数换成字符串判断几位
                String len = String.valueOf(num);
                char flag =c[len.length()-3];  //判断该整数对应c[]数组中的字符
                double sum=0;
                switch(flag){
                case 'b':
                        for(int i=0;i<len.length();i++){
                                int index=Character.getNumericValue(len.charAt(i));
                                sum+=BeautyNums.Daffodil.getNum(index);
                        }
                        if(sum==num){
                                numName+="D";
                        }else{
                                numName+="N";
                        }
                        break;
                case 'q':
                       
                        for(int i=0;i<len.length();i++){
                                sum+=BeautyNums.ClassFlower.getNum(Character.getNumericValue(len.charAt(i)));
                        }
                        if(sum==num){
                                numName+="C";
                        }else{
                                numName+="N";
                        }
                        break;
                case 'w':
                        for(int i=0;i<len.length();i++){
                                sum+=BeautyNums.GradeFlower.getNum(Character.getNumericValue(len.charAt(i)));
                        }
                        if(sum==num){
                                numName+="G";
                        }else{
                                numName+="N";
                        }
                        break;
                case 's':
                        for(int i=0;i<len.length();i++){
                                sum+=BeautyNums.Oh.getNum(Character.getNumericValue(len.charAt(i)));
                        }
                        if(sum==num){
                                numName+="O";
                        }else{
                                numName+="N";
                        }
                        break;
                default:
                        numName+="N";
                        break;
                }
                return numName;
               
        }

}

作者: 黄玉昆    时间: 2013-4-9 20:18
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
作者: 刘胜寒    时间: 2013-4-10 10:03
黄玉昆 发表于 2013-4-9 20:18
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢 ...

好的.......
作者: 刘胜寒    时间: 2013-4-10 14:12
  1. class Main {

  2.         public static void main(String[] args) {
  3.             Scanner cin = new Scanner(System.in);
  4.             int N;
  5.             while(cin.hasNext())
  6.             {
  7.                       N = cin.nextInt();
  8.                       if(N==153||N==370||N==371||N==407) System.out.printf("%c","D\n");
  9.                   else if(N==1634||N==8208||N==9474) System.out.printf("%c","C\n");
  10.                   else if(N==54748||N==92727||N==93084)System.out.printf("%c","G\n");
  11.                   else if(N==548834) System.out.printf("%c","O\n");
  12.                   else   System.out.printf("%c","N\n");
  13.             }
  14.         }
  15. }
复制代码
代码奉上...么有用set或者其他集合....
因为还要去判断N是多少位的.....
嫌他太麻烦...
作者: 刘胜寒    时间: 2013-4-10 14:18
邵震 发表于 2013-4-9 10:58
不用for用啥啊...if? while?switch?.....

看我的代码了....




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