黑马程序员技术交流社区

标题: 小程序又来了,大家做做,1到3分不等奥 [打印本页]

作者: 打工人    时间: 2012-10-27 12:34
标题: 小程序又来了,大家做做,1到3分不等奥
本帖最后由 冯海霞 于 2012-10-27 15:11 编辑

题目要求:判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
                  假设 n= 5
                注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。

作者: 刘伟平    时间: 2012-10-27 13:09
数字是可以重复的,才有回文数,
但是数字可以重复,0~6就可以组成无数个奇数了,又没限制位数
作者: 种生祥    时间: 2012-10-27 13:10
同上!!!
作者: 打工人    时间: 2012-10-27 13:16
刘伟平 发表于 2012-10-27 13:09
数字是可以重复的,才有回文数,
但是数字可以重复,0~6就可以组成无数个奇数了,又没限制位数 ...

对不起,同学,我大意了。改好了
作者: 打工人    时间: 2012-10-27 13:17
种生祥 发表于 2012-10-27 13:10
同上!!!

对不起,同学,我大意了。改好了
作者: 李春生    时间: 2012-10-27 14:04
请楼主点评

public class JiDemo
{
                   public static void main(String[] args)
                   {
                                                   int count = 0;
                                                   int odd = 0;
                                                   //声明由数字组成的数
                                                   int n = 8;
                                                   //一位数
                                                   count = n/2;
                                                   //两位数
                                                   count += (n-1)*n/2;
                                                   //三位数
                                                   count += (n-1)*n*n/2;
                                                   //四位数
                                                   count += (n-1)*n*n*n/2;
                                                   //五位数
                                                   count += (n-1)*n*n*n*n/2;
                                                   //六位数
                                                   count += (n-1)*n*n*n*n*n/2;
                                                   //七位数
                                                   count += (n-1)*n*n*n*n*n*n/2;
                                                  
                                                   //回文数 首末尾为奇数:n/2种
                                                   //       第二位和倒数第二位:n种 中间:n种
                                                   odd = n/2*n*n;
                                                  
                                                   System.out.println("0-7所能组成的奇数个数:"+count);
                                                  
                                                   System.out.println("这些奇数中五位数中的回文数个数:"+odd);
                                                  
       }
}
作者: 种生祥    时间: 2012-10-27 14:17
本帖最后由 种生祥 于 2012-10-27 14:21 编辑

{:soso_e101:}...   
作者: 打工人    时间: 2012-10-27 14:26
种生祥 发表于 2012-10-27 14:17
...

咋了咋了,是不是还有问题?我觉得没问题了吧
作者: 坚持不懈    时间: 2012-10-27 14:36
{:soso_e105:} 一看见数学题,头就疼.咋整
作者: 打工人    时间: 2012-10-27 14:38
坚持不懈 发表于 2012-10-27 14:36
一看见数学题,头就疼.咋整

这个不是纯数学题嘛,不要让别人的代码影响了你的思路
作者: 王自强    时间: 2012-10-27 14:55
本帖最后由 王自强 于 2012-10-27 17:37 编辑
  1. /*
  2. *题目要求:判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
  3.                   假设 n= 5
  4.                 注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
  5. * */
  6. public class Plalindrome {
  7.     public static void main(String[] args) {        
  8.         System.out.println("奇数个数为:" + oddCount1(5));   
  9.         
  10.         int n = 3;
  11.         System.out.println(n+"位数的回文数个数为:" + plalindromeCount1(n));
  12.         
  13.         System.out.println(printPlalindrome());
  14.     }
  15.     //返回由0-7组成的digit位的奇数个数
  16.     public static int  oddCount1(int digit){
  17.         double count = 0;
  18.         while(digit >= 2){
  19.             count += 7*(Math.pow(8, digit-2))*4;               
  20.             digit--;
  21.         }
  22.         return (int)(count+4);        
  23.     }   
  24.     //返回奇数中的digit位的回文数个数
  25.     public static int plalindromeCount1(int digit){
  26.    
  27.         double count = (Math.pow(8, (digit-1)/2))*4;   
  28.    
  29.         return (int)count;
  30.     }   
  31.     //返回奇数中的三位数的回文数值
  32.     public static int printPlalindrome(){
  33.         int count = 0;
  34.         int number ;
  35.         System.out.println("三位数的奇数的回文数有");
  36.         for(int x1=0; x1<=7; x1++){
  37.             for(int x2=0; x2<=7; x2++){
  38.                 for(int x3=0; x3<=7; x3++){        
  39.                     //由0-7组成的所有三位数
  40.                     number =x3*1+x2*10+x1*100;
  41.                     //将数字转成字符串,以方便进行回文数的判断
  42.                     String str = String.valueOf(number);
  43.                     //判断字符串的值是否是一个回文数
  44.                     boolean flag = new StringBuilder(str).reverse().toString().equalsIgnoreCase(str);
  45.                     //如果数字是三位的 && 是奇数 && 是回文数,count增加1,并打印出来它
  46.                     if( number>=100 && number <=1000 && (number%2 ==1) && flag){
  47.                         count++;                                
  48.                         System.out.print(number+",");
  49.                     }                                            
  50.                 }
  51.             }
  52.         }
  53.         System.out.println("");
  54.         System.out.println("回文数的个数是:");
  55.         return count;
  56.     }
  57. }

复制代码

作者: 打工人    时间: 2012-10-27 15:32
不能沉。。。。。。。。。。。。
作者: 会飞的鱼    时间: 2012-10-27 15:41
本帖最后由 845616011 于 2012-10-27 17:50 编辑

好像现在脑子越来越笨了,总是看不懂题目要求,但是注倒是看懂了:判断一个数是否为回文!!比如说五位回文,只是万位跟个位相等,千位跟十位相等。
这里取万位,千位,十位和个位其实是有规律的,以前在课堂上玩出来的,用的是/取整,%取余。什么规律我也不知道怎么说,这个只可意会不可言传!我只知道后面的叔取余,前面的取整。单取一次还不够的话,再这样循环。这时再去判断万位和个位是否相等,同时千位和十位是否相等。
int i=12345;
System.out.println(i/10000);        //万位
System.out.println(i/1000%10);        //千位
System.out.println(i/100%10);        //百位
System.out.println(i%100/10);        //十位
System.out.println(i%10);        //个位
  1. package com.efoxconn.util;

  2. public class HuiWenTest {
  3. /*
  4. * 题目要求:判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数,假设 n= 5。
  5. * 注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
  6. */

  7. public static void main(String[] args){
  8. getJCount();
  9. getHCount();
  10. }
  11. /*
  12. * 0到7组成的五位及以下的数,最小为0,最大为77777。
  13. */
  14. public static void getJCount(){
  15. int count=0;
  16. for(int i=0;i<=77777;i++){
  17. if(i%2==1){
  18. count++;
  19. }
  20. }
  21. /*
  22. * count=i/2+1;
  23. */
  24. System.out.println("77777以下中有"+count+"个奇数!!");
  25. }
  26. /*
  27. * 回文要么五位数,要么三位数
  28. */
  29. public static void getHCount(){
  30. int count=0;
  31. int count1=0;
  32. int count2=0;
  33. for(int i=0;i<=77777;i++){
  34. //首先判断是否为奇数,不是continue
  35. if(i%2==1){
  36. //判断是否为五位数,如是,当万位跟个位相等,并且千位跟十位相等时,视为回文
  37. if((i>10000)&&(i<77777)){
  38. int wan=i/10000; //取万位
  39. int qian=i/1000%10; //取千位
  40. int shi=i%100/10;
  41. int ge=i%10;
  42. if(wan==ge&&qian==shi){
  43. count++;
  44. count1++;
  45. }
  46. //潘但是否为三位数,如是,当个位和百位相等时,视为回文
  47. }else if((i>100)&&(i<1000)){
  48. int bai=i/100;
  49.    int ge=i%10;
  50. if(bai==ge){
  51. count++;
  52. count2++;
  53. }
  54. }
  55. }
  56. continue;
  57. }
  58. System.out.println("其中有"+count+"个回文!!");
  59. System.out.println("10000-77777间有"+count1+"个回文!!");
  60. System.out.println("100-1000中有"+count2+"个回文!!");
  61. }
  62. }
复制代码

作者: 官仁杰    时间: 2012-10-27 15:47
“这些数中3位数中的回文数”是指0-7组成的3位数的回文个数?
就是121,131这些?
作者: 古银平    时间: 2012-10-27 15:55
845616011 发表于 2012-10-27 15:41
好像现在脑子越来越笨了,总是看不懂题目要求,但是注倒是看懂了:判断一个数是否为回文!!比如说五位回文 ...

那就以你的思想写出代码,
作者: 古银平    时间: 2012-10-27 15:55
官仁杰 发表于 2012-10-27 15:47
“这些数中3位数中的回文数”是指0-7组成的3位数的回文个数?
就是121,131这些? ...

用代码表示出来
作者: 李亚飞    时间: 2012-10-27 16:37
本帖最后由 落叶街 于 2012-10-27 16:52 编辑

public class Demo1 {

        /**
         * @param java新手 用for循环嵌套一个一个取出奇数
         * 奇数个数:1048576
         * 3位数的回文数个数:32
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                lens();
        }
        public static void lens()
        {
                int jiLens = 0 ,hwLens = 0 ,num = 0 , len_1 = 0 , len_2 = 0 ;
                int len_3 = 0 ,        len_4 = 0 , len_5 = 0 , len_6 = 0, len_7 = 0 ;
                //1位 数的时候  奇数个数 和回文数个数
                for(int i=0;i<=7;i++)
                {
                        if(i%2==1)
                        {
                                len_1++;
                                //System.out.println("奇数:"+i);
                        }
                }
                //2位  数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                num = i*10 + j ;
                                if(num%2==1)
                                {
                                        len_2++;
                                        //System.out.println("奇数:"+num);
                                }
                        }
                }
                //3位 数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                for(int a=0;a<=7;a++)
                                {
                                        num = i*100 + j*10 + a ;
                                        if(num%2==1)
                                        {
                                                len_3++;
                                                //System.out.println("奇数:"+num);
                                                if(i!=0&&i==a){
                                                        hwLens++;
                                                        System.out.println("3位数的回文数:"+num);
                                                }
                                        }
                                       
                                }
                        }
                }
                //4位 数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                for(int a=0;a<=7;a++)
                                {
                                        for(int b=0;b<=7;b++)
                                        {
                                                num = i*1000 + j*100 + a*10 + b ;
                                                if(num%2==1)
                                                {
                                                        len_4++;
                                                        //System.out.println("奇数:"+num);
                                                }
                                        }
                                }
                        }
                }
                //5位 数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                for(int a=0;a<=7;a++)
                                {
                                        for(int b=0;b<=7;b++)
                                        {
                                                for(int c=0;c<=7;c++)
                                                {
                                                        num = i*10000 + j*1000 + a*100 + b*10 + c ;
                                                        if(num%2==1)
                                                        {
                                                                len_5++;
                                                                //System.out.println("奇数:"+num);
                                                        }
                                                }
                                        }
                                }
                        }
                }
                //6位 数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                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++)
                                                        {
                                                                num = i*100000 + j*10000 + a*1000 + b*100 + c*10 + d ;
                                                                if(num%2==1)
                                                                {
                                                                        len_6++;
                                                                        //System.out.println("奇数:"+num);
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
                //7位 数的时候  奇数个数 和回文数个数
                for(int i=1;i<=7;i++)
                {
                        for(int j=0;j<=7;j++)
                        {
                                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 = i*1000000 + j*100000 + a*10000 + b*1000 + c*100 + d*10 + e ;
                                                                        if(num%2==1)
                                                                        {
                                                                                len_7++;
                                                                                //System.out.println("奇数:"+num);
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
                jiLens = len_1 + len_2 + len_3 + len_4 + len_5 + len_6 + len_7 ;
                System.out.println("奇数个数:"+jiLens);
                System.out.println("3位数的回环数个数:"+hwLens);        
               
        }

}

作者: 刘伟平    时间: 2012-10-27 16:39
本帖最后由 刘伟平 于 2012-10-27 16:58 编辑

累死我了,终于搞定了
  1. import java.util.*;
  2. /*
  3. 题目要求:判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
  4. 假设 n= 5
  5. 注:回文数:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
  6. */
  7. class OddTest {
  8.         public static void main(String[] args) {
  9.                 getOdd(5);
  10.         }
  11.         private static void getOdd(int n) {
  12.                 // 保存奇数的集合
  13.                 ArrayList<Integer> odds = new ArrayList<Integer>();
  14.                 // 保存回文数的集合
  15.                 ArrayList<Integer> palindromes = new ArrayList<Integer>();
  16.                 // 获取小于n位数的,各种位数的最大值
  17.                 int[] maxNum = new int[n];
  18.                 for (int i = 0; i < n; i++) {
  19.                         for (int j = 0; j <= i; j++) {
  20.                                 maxNum[i] += 7 * (int) Math.pow(10, j);
  21.                         }
  22.                 }

  23.                 outer: for (int i = 0; i <= maxNum[n - 1]; i++) {
  24.                         // 判断数字是否不在0 - 7 范围内
  25.                         for (int j = 0; j < n; j++) {
  26.                                 if ((i % Math.pow(10, n - j)) <= maxNum[n - j - 1]) {
  27.                                 } else
  28.                                         continue outer;
  29.                         }

  30.                         if (i % 2 == 1) {
  31.                                 odds.add(i);
  32.                                 if (i > 99 & i < 1000) {
  33.                                         // i/100:百位
  34.                                         // i%10:个位
  35.                                         if (i / 100 == i % 10) {
  36.                                                 palindromes.add(i);
  37.                                         }
  38.                                 }
  39.                         }
  40.                 }

  41.                 System.out.println("奇数列表:");
  42.                 for (int i : odds) {
  43.                         System.out.print(i + " , ");
  44.                 }

  45.                 System.out.print("\r\n回文数列表:");
  46.                 for (int i : palindromes) {
  47.                         System.out.print(i + " , ");
  48.                 }

  49.                 System.out.println();
  50.                 System.out.println("奇数个数:" + odds.size());
  51.                 System.out.println("三位回文数个数:" + palindromes.size());
  52.         }
  53. }
复制代码

结果.rar

2.47 KB, 下载次数: 226

程序的输出结果,TXT文件


作者: 官仁杰    时间: 2012-10-27 17:11
本帖最后由 官仁杰 于 2012-10-27 18:10 编辑
  1. public class test2 {
  2.         public static void main(String[] args) {
  3.                 method();
  4.                 method2();

  5.         }
  6.         public static void method(){        //判断由0-7组成的5位和5位以下奇数的个数
  7.                 int count = 0;
  8.                 for(int a = 0;a<=7;a++)
  9.                         for(int b = 0;b<=7;b++)
  10.                                 for(int c = 0;c<=7;c++)
  11.                                         for(int d = 0;d<=7;d++)
  12.                                                 for(int e = 0;e<=7;e++){
  13.                                                         if(a%2 == 1) count ++;    //判断个位数是否奇数
  14.                                                         }
  15.                 System.out.println("由0-7组成的5位和5位以下奇数的个数为" + count) ;
  16.         }
  17.         
  18.         public static void method2(){         //判断由0-7组成的3位数的回文数个数
  19.                 int count =0;
  20.                 for(int a = 1;a<=7;a+=2)
  21.                         for(int b = 0;b<=7;b++){
  22.                                 count ++;                //第三位一定和第一位数一样
  23.                         }
  24.                 System.out.println("由0-7组成的3位数的回文数个数为" + count) ;
  25.         }        
  26. }
复制代码
输出:
由0-7组成的5位和5位以下奇数的个数为16384
由0-7组成的3位数的回文数个数为32


作者: 张学东    时间: 2012-10-27 17:48
本帖最后由 张学东 于 2012-10-27 18:01 编辑

同学们都把常用的方法都写完啦,,没办法 我就只有用我自己的办法了  呵呵 希望能拿点分  。。。。嘿嘿  本来想全部用String的 但是我觉得求奇数那里还是取模的好。。
  1. package com.heima.zxd;
  2. /**
  3. * 判断并打印由0-7组成的n位和n位以下奇数的个数以及这些数中3位数中的回文数
  4.            假设 n= 5
  5. */
  6. public class huiwen {
  7.         public static void main(String[] args) {
  8.                
  9.                 int cont=0;int huiwen=0;
  10.                 int number1=0;//由0到7组成的数
  11.                 int number2=0;//奇数
  12.                
  13.                 for( int number=0;number<=99999;number++)
  14.                 {
  15.                         String strnum=String.valueOf(number);
  16.                         
  17.                         if(!(strnum.contains("8")||strnum.contains("9"))){
  18.                                 number1=number;
  19.                                 if(number1%2==1){
  20.                                         cont++;
  21.                                         number2=number1;
  22.                                         if(number2>100&&number2<999){
  23.                                         int number3=number2;
  24.                                         String num = String.valueOf(number3);  
  25.                                         String reversenum=new StringBuffer(num).reverse().toString();
  26.                                          if(reversenum.equalsIgnoreCase(num)){
  27.                                                         huiwen++;
  28.                                                         System.out.println(number3);
  29.                                                         
  30.                                                 }
  31.                                          }
  32.                                 }
  33.                         }         
  34.                 }
  35.                                 
  36.                 System.out.println("五位数的奇数是"+cont+"个");
  37.                 System.out.println("回文数的个数是"+huiwen+"个");
  38.                
  39.         }
  40. }
复制代码

无标题.png (8.54 KB, 下载次数: 50)

无标题.png

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

我们一起商量出题的时候可能表达的不是很清楚,望见谅。以后要是再不明白题意,就直接找我们。我们以后尽量将题目描述清楚:loveliness:
作者: 王龙    时间: 2012-10-27 18:53
学习了,{:soso_e100:}
作者: 张吉日    时间: 2012-10-27 19:57
写个代码是发在这里吧

HuiShuDemo.zip

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


作者: 古银平    时间: 2012-10-27 20:17
王自强 发表于 2012-10-27 14:55

你要是改了代码,就重新在下面回复下,不然加不了分
作者: 王永荣    时间: 2012-10-27 21:00
  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. }
复制代码
运行结果为:


作者: 张吉日    时间: 2012-10-27 21:11
张吉日 发表于 2012-10-27 19:57
写个代码是发在这里吧

好的,主要我写的不是很好 :)
作者: 王永荣    时间: 2012-10-27 21:15
回文数也要是奇数的话,只要加个判断就行了。。{: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.         }
复制代码

作者: 李春生    时间: 2012-10-27 21:33
本帖最后由 李春生 于 2012-10-27 21:38 编辑

表示不理解我第一个做了,又简单给那么少的分{:soso_e109:},打击我的积极性
作者: 打工人    时间: 2012-10-27 21:42
李春生 发表于 2012-10-27 21:33
表示不理解我第一个做了,又简单给那么少的分,打击我的积极性

同学。。。写代码不能把它纯粹的当成解数学题
作者: 杨雪松    时间: 2012-10-28 09:16
本帖最后由 杨雪松 于 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
作者: 王禹衡    时间: 2012-10-28 09:50
  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 10:38
wangyuheng 发表于 2012-10-28 09:50
思路有没有问题??

名字怎么改啊?
共有奇数:8232
其中回文数有:2646
结果对吗?
考虑过效率问题,continue之类的,没有想到解决方法
作者: 打工人    时间: 2012-10-28 10:44
wangyuheng 发表于 2012-10-28 10:38
名字怎么改啊?
共有奇数:8232
其中回文数有:2646

1、改名字的话要申请,具体你可以问一下滔哥或者待会我帮你问问。
2、回文数的话,我不知道你是不是按照题意计算的,计算的是组成的奇数里面三位数中的回文数,32个一共。
3、奇数的个数是16384

作者: 打工人    时间: 2012-10-28 10:51
wangyuheng 发表于 2012-10-28 10:38
名字怎么改啊?
共有奇数:8232
其中回文数有:2646

http://bbs.itheima.com/thread-19719-1-1.html
同学,进这里修改
作者: 王禹衡    时间: 2012-10-28 13:40
冯海霞 发表于 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);
        }
}
改正了,答案是对的了,就是调优没想好
作者: 王禹衡    时间: 2012-10-28 13:41
冯海霞 发表于 2012-10-28 10:51
http://bbs.itheima.com/thread-19719-1-1.html
同学,进这里修改

好的  改正了  谢谢啊
作者: 罗会涛    时间: 2012-10-28 21:26
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;
        }
}





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