A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 打工人   /  2012-10-27 12:34  /  4950 人查看  /  36 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

845616011 发表于 2012-10-27 15:41
好像现在脑子越来越笨了,总是看不懂题目要求,但是注倒是看懂了:判断一个数是否为回文!!比如说五位回文 ...

我们一起商量出题的时候可能表达的不是很清楚,望见谅。以后要是再不明白题意,就直接找我们。我们以后尽量将题目描述清楚:loveliness:
回复 使用道具 举报
王龙 中级黑马 2012-10-27 18:53:36
22#
学习了,{:soso_e100:}
回复 使用道具 举报
写个代码是发在这里吧

HuiShuDemo.zip

763 Bytes, 阅读权限: 100, 下载次数: 5

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 以后这样的小程序直接放代码,ok.

查看全部评分

回复 使用道具 举报
王自强 发表于 2012-10-27 14:55

你要是改了代码,就重新在下面回复下,不然加不了分
回复 使用道具 举报
  1. class Demo{
  2.         static int count1 = 0; //奇数个数
  3.         static int count2 = 0; //回文数个数
  4.         public static void main(String[] args){               
  5.                 nOdd(5);
  6.                 System.out.println("奇数个数:"+count1);
  7.                 nHW();
  8.                 System.out.println("回文数个数:"+count2);
  9.         }
  10.         
  11.         public static int nOdd(int n){

  12.                 //判断个位数的奇偶即可。
  13.                 if(n==1){
  14.                         for(int i= 0;i<8;i++){    //0-7
  15.                                 if(i%2==1){
  16.                                         count1++;
  17.                                 }
  18.                         }
  19.                         return count1;
  20.                 }
  21.                 //0-7组成的n位数,递归判断奇偶
  22.                 if(n>1){
  23.                         for(int j= 1;j<8;j++){
  24.                                 nOdd(n-1);
  25.                         }
  26.                 }
  27.                 return count1+nOdd(n-1);
  28.                
  29.         }
  30.         //0-7组成的3位数中的回文数即百位==个位,十位为0-7任意数,即共7*8个
  31.         public static int nHW(){
  32.                 for(int a = 1; a<8 ;a++){
  33.                         for(int b = 0; b<8 ;b++){
  34.                                 System.out.print(a*100+b*10+a+" ");
  35.                                 count2++;
  36.                         }
  37.                 }                        
  38.                 return count2;
  39.         }
  40. }
复制代码
运行结果为:

评分

参与人数 1黑马币 +30 收起 理由
冯海霞 + 30 赞一个!但是你弄错题意了,要打印的是0-7组.

查看全部评分

回复 使用道具 举报
张吉日 发表于 2012-10-27 19:57
写个代码是发在这里吧

好的,主要我写的不是很好 :)
回复 使用道具 举报
回文数也要是奇数的话,只要加个判断就行了。。{:soso_e146:}
  1.   //0-7组成的3位数奇数中的回文数即百位==个位,个位为奇数,十位为0-7任意数,即4*8个
  2.         public static int nHW(){
  3.                 for(int a = 1; a<8 ;a++){
  4.                         for(int b = 0; b<8 ;b++){
  5.                                 if(a%2==1){
  6.                                     System.out.print(a*100+b*10+a+" ");
  7.                                     count2++;
  8.                                 }
  9.                         }
  10.                 }                        
  11.                 return count2;
  12.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 李春生 于 2012-10-27 21:38 编辑

表示不理解我第一个做了,又简单给那么少的分{:soso_e109:},打击我的积极性
回复 使用道具 举报
李春生 发表于 2012-10-27 21:33
表示不理解我第一个做了,又简单给那么少的分,打击我的积极性

同学。。。写代码不能把它纯粹的当成解数学题
回复 使用道具 举报
本帖最后由 杨雪松 于 2012-10-28 12:56 编辑
  1. package t09;
  2. /*
  3. *题目要求:判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
  4.                    假设 n= 5
  5.                  注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
  6. * 思路:1.使用for嵌套遍历出所有可能
  7. *                 2.找出奇数        
  8. *                3. 找出3位回文数
  9. */
  10. public class Test1
  11. {

  12.                 public static void main(String[] args)
  13.                 {        
  14.                    int x = 0,y=0;
  15.                    for(int a = 0;a<=7;a++)//万
  16.                    for(int b = 0;b<=7;b++)//千
  17.                    for(int c = 0;c<=7;c++)//百
  18.                    for(int d = 0;d<=7;d++)//十
  19.                    for(int e = 0;e<=7;e++)//个
  20.                        {
  21.                        if(e%2 == 1) //个位奇数判断;
  22.                                {
  23.                                 x ++; //存起来;
  24.                                 if(a==0&&b==0&&c==e&&c!=0&&e!=0)
  25.                                            {
  26.                                               y++;//顺便找出3位回文数;
  27.                                               System.out.print(c+""+d+""+e+",");//没注意还要打印这个....加上一句就哦了;
  28.                                             }
  29.                                }
  30.                        }
  31.                 System.out.println("奇数的个数为" + x) ;
  32.                 System.out.println("3位回文数" + y) ;
  33.                 }
  34. }
复制代码
新人也来凑个热闹
太复杂的不会,不过这样好像结果也是对的:

101,111,121,131,141,151,161,171,303,313,323,333,343,353,363,373,505,515,525,535,545,555,565,575,707,717,727,737,747,757,767,777,
奇数的个数为16384
3位回文数32

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1 赞一个!加油,

查看全部评分

回复 使用道具 举报
  1. /*
  2. * 题目要求:
  3. * 判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
  4.         假设 n= 5
  5.         
  6.        注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
  7.         思路:利用循环来做
  8.                   n = 5, 最大数为77777,0位为0-7,其他均为1-7
  9.                   num = e+d*10+c*100+b*1000+a*10000; 累加遍历
  10.                   判断是否为奇数(%2!=0),计数器累加
  11.                   回文数的判断:5位 e=a &&d=b
  12.                                             4位e=b &&d=c
  13.                                             3位e=c
  14. */
  15. public class Text_1 {
  16.         public static void main(String[] args) {
  17. //                int n = 5;
  18.                 int num = 0;
  19.                 int count = 0;
  20.                 int count_hui = 0;
  21.                 for (int a = 1; a <= 7; a++) {//除个位外,均不可以0开头
  22.                         for (int b = 1; b <=7 ; b++) {
  23.                                 for (int c = 1; c < 7; c++) {
  24.                                         for (int d = 1; d <= 7; d++) {
  25.                                                 for (int e = 0; e <= 7; e++) {
  26.                                                         num = e+d*10+c*100+b*1000+a*10000;
  27.                                                         if(num%2!=0){
  28.                                                                 count++;
  29.                                                         }
  30.                                                         num = e+d*10+c*100;
  31.                                                         if(e==c){count_hui++;}
  32.                                                         num = e+d*10+c*100+b*1000;
  33.                                                         if(e == b && d == c){count_hui++;}
  34.                                                         num = e+d*10+c*100+b*1000+a*10000;
  35.                                                         if(e == a && d == b){count_hui++;}
  36.                                                 }
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }
  41.                 System.out.println("共有奇数:"+count);
  42.                 System.out.println("其中回文数有:"+count_hui);
  43.         }
  44. }
复制代码
思路有没有问题??

点评

哥们,麻烦你把名字改好吧  发表于 2012-10-28 09:59
那么多循环嵌套,如果数更大的话,你的循环要嵌套多少,注意程序的可读性,效率,扩展性;递归和循环不能太大,就是嵌套太多,不过鼓励下你吧  发表于 2012-10-28 09:57

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 加油吧,注意程序可读性,扩展性,效率.

查看全部评分

回复 使用道具 举报
wangyuheng 发表于 2012-10-28 09:50
思路有没有问题??

名字怎么改啊?
共有奇数:8232
其中回文数有:2646
结果对吗?
考虑过效率问题,continue之类的,没有想到解决方法
回复 使用道具 举报
wangyuheng 发表于 2012-10-28 10:38
名字怎么改啊?
共有奇数:8232
其中回文数有:2646

1、改名字的话要申请,具体你可以问一下滔哥或者待会我帮你问问。
2、回文数的话,我不知道你是不是按照题意计算的,计算的是组成的奇数里面三位数中的回文数,32个一共。
3、奇数的个数是16384
回复 使用道具 举报
wangyuheng 发表于 2012-10-28 10:38
名字怎么改啊?
共有奇数:8232
其中回文数有:2646

http://bbs.itheima.com/thread-19719-1-1.html
同学,进这里修改
回复 使用道具 举报
冯海霞 发表于 2012-10-28 10:44
1、改名字的话要申请,具体你可以问一下滔哥或者待会我帮你问问。
2、回文数的话,我不知道你是不是按照 ...

public class Text_1 {
        public static void main(String[] args) {
//                int n = 5;
                int num = 0;
                int count = 0;
                int count_hui = 0;
                for (int a = 0; a <= 7; a++) {                        for (int b = 0; b <=7 ; b++) {
                                for (int c = 0; c <= 7; c++) {
                                        for (int d = 0; d <= 7; d++) {
                                                for (int e = 0; e <= 7; e++) {
                                                        num = e+d*10+c*100+b*1000+a*10000;
                                                        if(num%2!=0){
                                                                count++;
                                                        }

                                                }
                                        }
                                }
                        }
                }
                for (int a = 0; a <= 7; a++) {
                        for (int b = 0; b <= 7; b++) {
                                for (int c = 0; c <= 7; c++) {
                                        num = a+b*10+c*100;
                                        if(num%2!=0){
                                                if(a==c){
                                                        count_hui++;
                                                }
                                        }
                                       
                                }
                               
                        }
                }
                System.out.println("共有奇数:"+count);
                System.out.println("其中回文数有:"+count_hui);
        }
}
改正了,答案是对的了,就是调优没想好

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 鼓励下,不要嵌套太多循环

查看全部评分

回复 使用道具 举报
冯海霞 发表于 2012-10-28 10:51
http://bbs.itheima.com/thread-19719-1-1.html
同学,进这里修改

好的  改正了  谢谢啊
回复 使用道具 举报
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test
{
        /**
         * 首先将给的数字进行分析analyze()得到:总共有多少个数字total, 奇数有多少个oddNum, 是否包含0即zeroNum,
         * 顺便定义一个布尔值errorNum表示给的数字是否有问题。
         */
        static int totalNum = 0;
        static int oddNum = 0;
        static int zeroNum = 0;
        static boolean errorNum = false;

        public static void analyze(Set<Integer> s)
        {
                /* 遍历所给的这些数字(题目中就是0到7)得到上面几个变量的值,其中temp用来临时存储这些数字。 */
                Iterator<Integer> it = s.iterator();
                int temp;
                while (it.hasNext())
                {
                        temp = it.next();
                        if (temp < 0 || temp > 9)
                        {
                                System.out.println("您给的数字不和规范请更正!");
                                errorNum = true;
                        }
                        if (temp == 0)
                        {
                                zeroNum = 1;
                        }
                        if ((temp + 1) / 2 != temp / 2)
                        {
                                oddNum = oddNum + 1;
                        }
                        totalNum = totalNum + 1;
                }
        }

        public static void main(String[] args)
        {
                /* 由于给的数字应该是无顺序不可重复的(因为数字可以重复使用),弄一个Hashset来装这些数字,一个个装进去。 */
                HashSet<Integer> hs = new HashSet<Integer>();
                hs.add(0);
                hs.add(1);
                hs.add(2);
                hs.add(3);
                hs.add(4);
                hs.add(5);
                hs.add(6);
                hs.add(7);
                /* 分析一下 */
                analyze(hs);
                /* 调用统计奇数函数CountOdd并将给定的位数5传进去,调用统计回文奇数的函数CountOdd并将给定的位数3传进去. */
                System.out.println("奇数的个数是 :" + CountOdd(5));
                System.out.println("其中回文数的个数是 : " + Countmatched(3));
        }

        public static int CountOdd(int digit)
        {
                if (errorNum || digit < 1)
                {
                        System.out.println("您给的数字不合规范!");
                        return 0;
                }
                /* 只有一位时单独计算就是数字中的奇数个数oddNum. */
                if (digit == 1)
                {
                        return oddNum;
                }
                /**
                 * 2位以上的数,由于数字0不能出现在首位,将首位数的可选个数(totalNum -
                 * zeroNum)(题目中有0这个结果就是7)和末尾数的可选个数oddNum
                 * (其实就是4)当公因式提出来,后面乘上(digit-2)个总数字totalNum
                 * (即8),得到当位数为digit时是奇数的个数(7*4*8*8*....*8),循环迭代一下即可。
                 */
                int temp = 0;
                for (int i = 0; i < digit - 1; i++)
                {
                        temp = temp + (int) Math.pow(totalNum, i);
                }
                return oddNum * (totalNum - zeroNum) * temp + oddNum;
        }

        public static int Countmatched(int digit)
        {
                if (errorNum || digit < 1)
                {
                        System.out.println("您给的数字不合规范!");
                        return 0;
                }
                /**
                 * 回文奇数不存在首位是0的问题,并且偶数位数与比它少一位的奇数位数的个数是一样多(如2位和1位、3位与2位),只需考虑当位数为一半时(
                 * 向上取整
                 * )其奇数的个数即可(3、4位相当于2位奇数,5、6位相当与3位奇数)(当位数少于3位时不执行for直接返回奇数数字个数oddNum)。
                 */
                int temp = oddNum;
                for (int i = 1; i < (digit + 1) / 2; i++)
                {
                        temp = temp * totalNum;
                }
                return temp;
        }
}

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马