蓝桥杯入门训练——回文数与特殊回文数

硬派健身 2018-01-29

简单的回文数

蓝桥杯入门训练——回文数与特殊回文数

看到好几种方法啊

方法一(取巧但耗时最少):

public class Main {

    public static void main(String[] args) {
        for(int i=1;i<10;i++){  
           for(int j=0;j<10;j++){  
               System.out.println(""+i+j+j+i);  
                //或者
                // System.out.printf("%d%d%d%d",i,j,j,i);  
                // System.out.println();                 
            }  
        }  

    }

}

方法二(从右往左读,判断是否相等)

public class Main {  
    public static void main(String[] args) throws Exception {  
        for (int i = 1000; i < 10000; i++) {  
            int a = i;  
            int b = 0;  
            while (a!=0) {  
                b = b * 10 + a % 10;  
                a = a / 10;  
            }  
            if (b == i) {  
                System.out.println(i);  
            }  
        }  
    }  
}  <br />

方法三(用除法获取每一位数,然后比较)。。。。

方法四(使用char[] 来保存每一位数,然后比较)。。

public class Main {

    public static void main(String[] args) {
        for(int i=10000;i<1000000;i++){
            int flag = 0;
            String str =""+i;
            char[] chars = str.toCharArray();
            for(int j=0;j<chars.length/2; j++)
            {
                //判断第0个是否等于第n-0个,第1个是否等于第n-1个,n-( )=j
                flag = j;
                if(chars[j] != chars[ chars.length-1-j] )
                    break;
                flag++;//flag用来获取位置,判断前一半是否等于后一半
            }
            //判断前一半是否等于后一半
            if(flag>=chars.length/2)
                System.out.println(str);
        }
    }
}

感觉法一比较灵巧啊


蓝桥杯入门训练——回文数与特殊回文数

方法一(上边的法一变形,耗时较少,约265ms,内存占用20.99MB):

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        sc.close();
        
        //因为回文5或6位,所以abcba或abccba


        //遍历abc即可,万位不为0,即a!=0
        for(int a=1;a<=9;a++)
        for(int b=0;b<=9;b++)
        for(int c=0;c<=9;c++)
        {
        //判断与输入数字相等即可
        if(num==2*a+2*b+c)
            System.out.println(""+a+b+c+b+a);
        }
        //与上同理
        for(int a=1;a<=9;a++)
            for(int b=0;b<=9;b++)
            for(int c=0;c<=9;c++)
        {
        if(num==2*a+2*b+2*c)
            System.out.println(""+a+b+c+c+b+a);
        }
    }

}

方法二(上边法四的变形,耗时较长,约468ms,内存占用88.32MB):

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        sc.close();
        for(int i=10000;i<1000000;i++){
            int flag = 0;
            String str =""+i;
            char[] chars=str.toCharArray();
            for(int j=0;j<chars.length/2; j++)
            {
                //判断第0个是否等于第n-0个,第1个是否等于第n-1个,n-( )=j
                flag = j;
                if(chars[j] != chars[chars.length-1-j])
                    break;
                flag++;//flag用来获取位置,判断前一半是否等于后一半
            }
            //判断前一半是否等于后一半
            if(flag>=chars.length/2)
            {
                //如果相等再循环相加判断是否等于输入的值
                int sum=0;
                for(int z=0;z<chars.length;z++)
                {
                    sum = sum + chars[z]-'0';
                }
                if(sum==num)
                    System.out.println(str);
            }
                
        }
    }

}

相关推荐