输出0-10000之间 3的倍数而且含5的数,如15,54,555等等。
本题很简单,但是求:
1、最容易理解的解法,
2、代码最短的解法
3、最高效的解法。抛砖引玉,先贴一个。(有bug)    static void foo(){
        int j=0;int k=0;
        for(int i=0;i<10000;i++){
            //k++;
            if(i%3== 0){
                int n=i,m=i;
                while(m!=0){
                    m=m%10;
                    if(m==5){/*j++;*/System.out.printf ("i=%3d \n ",i);}
                    n=n/10;
                    m=n;
                }                
            }
        }
        //System.out.println(k+" "+j);
    }

解决方案 »

  1.   


    public static void main(String[] args) {
    // TODO Auto-generated method stub
    for(int i=0;i<10001;i++){
    if(i%3==0){
    if(String.valueOf(i).indexOf("5")!= -1){
    System.out.println(i);
    }
    }
    }
    }
      

  2.   

    把楼主的例子修改为
    for(int i=3;i<10000;i+=3){
    }
    应该是一种解法
      

  3.   


    public static void main(String[] args) {
            for(int i=3;i<10001;i+=3){
               if(String.valueOf(i).indexOf("5")!= -1){
                      System.out.println(i);
               }
            }
    }楼上的意思?
      

  4.   

    2楼,不算,String.valueOf(i)的不要。
    3楼,good。
      

  5.   


    /**
     *
     * @author ZangXT
     */
    public class Main {    public static void main(String[] args) {
            for (int i = 3; i < 10000; i += 3) {
                int m = i;
                do {
                    if (m % 10 == 5) {
                        System.out.println(i);
                        break;
                    }
                    m /= 10;            } while (m != 0);
            }
        }
    }
      

  6.   


    public class Test3 {
    public static void main(String[] args) {
    String s = null;
    for(int i=3; i<10000; i+=3){
    s = "" + i;
    if(s.matches("\\d*5\\d*")){
    System.out.print(s + " ");
    }
    }
    }
    }
    刚学了正则表达式……用一下……
      

  7.   


    public final class Test1 {    public static void main(String[] args) {        int sum = 0;        for (int i = 3; i < 10000; i += 3) {
                if (String.valueOf(i).indexOf("5") != -1) {
                    System.out.println(i);
                    sum++;
                }
            }
            System.out.println("SUM: " + sum);
        }
    }
      

  8.   

    for (int i = 0; i <= 10000; i += 3)
        if (i % 3 == 0 && String.valueOf(i).indexOf("5") > -1)
    System.out.println(i);
      

  9.   

    修改一下:
    int sum=0;
    for (int i = 0; i <= 10000; i += 3)
        if (i % 3 == 0 && String.valueOf(i).indexOf("5") > -1)
    sum++;
      

  10.   

    人多力量大。
    我又想到了一个:
        static void foo(){
            for(int i=0;i<10000;i++){           
                if(i%3== 0 && include(i,5)){
                    System.out.printf ("i=%3d ",i);              
                }
            }
        }
       static boolean include(int i,int x){
            while ( i != 0){
                if (i % 10 == x) return true;
                i /=10;
            }
            return false;
        }
      

  11.   

    public class Test {
    public static void main(String args[]) {
    for (int i = 3; i < 1000; i += 3) {
    if ((i + "").matches("^\\d*5\\d*$"))
    System.out.println(i);
    }
    }
    }
      

  12.   

    2、最简洁的解法:6楼和使用String(含matches)的朋友。
      

  13.   

    package x;
    class Test
    {
    public static void main(String args[])
    {
    String str;
    for(int i=3;i<10000;i++)
    {
    if(i%3==0)
    {
    str=Integer.toString(i);//将每个整数值转换成字符串对象
    for(int k=0;k<str.length();k++)
    {
    if(str.charAt(k)==53)//53为5的ASCII值
    System.out.println(i);
    }

    }
    }
    }
    }
      

  14.   

    这个思路也很简单, 
      四个数   5   7  a  b
       a,b的取值范围是 0__9    只要满足a+b是3的倍数就可以  
        然后四个数进行全排列,
     注:只要每位数字之和能被3整除,这个数字就是3的倍数.
      

  15.   

    我们来算下,a和b取值是10*10再全排列10*10*4!=2400
    用for(int i=3;i<10000;i+=3)加正则: 10000/3=3333
    再算上其他的其实根本效率优势
      

  16.   

    (a+b)%3==0
    对于符合条件的a,b还要注意a,b为(0,0),(3,3),(6,6),(9,9)的情况,因为有重复的数出现,必须过滤。
    对于a,b为(5,7),(7,5),(5,1),(1,5),(4,5),(5,4)等也要单独处理
    感觉代码写起来并不方便。
      

  17.   

    我用的是方法调用,应该比较不高效:(
       void foo_2(){
            for(int i=0;i<1000;i+= 3){          
                if(include(i,5) && include( i,7)){
                    System.out.print (" "+i);              
                }
            }   private boolean include(int i,int x){
            while ( i != 0){
                if (i % 10 == x) return true;
                i /=10;
            }
            return false;
        }