藍橋杯入門訓練——回文數與特殊回文數


簡單的回文數

看到好幾種方法啊

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

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);  
            }  
        }  
    }  
}  

方法三(用除法獲取每一位數,然后比較)。。。。

 

方法四(使用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);
            }
                
        }
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM