1. 程式人生 > >【精選】JAVA入門演算法題(二)

【精選】JAVA入門演算法題(二)

時時要有危機意識。別以為你命好運也好。

1.題目:打印出所有的 水仙花數 ,所謂 水仙花數 是指一個三位數,其各位數字立方和等於該數本身。

例如:153是一個 水仙花數 ,因為153=1的三次方+5的三次方+3的三次方。

題非常簡單,只要用for迴圈,取出數的個位、十位、百位差不多就完成了

 for (int i=100;i<1000;i++){
            int a=i/100;
            int b=i/10%10;
            int c=i%10;
            if (i==a*a*a+b*b*b+c*c*c){
                System.out.println(i);
            }
        }

2.題目:一個數如果恰好等於它的因子之和,這個數就稱為"完數"。

例如6=1+2+3。程式設計找出1000以內的所有完數。

這道題呢,我們只需要在之前找素數的程式上稍加修改就好了

int sum;
        for (int i=1;i<1000;i++){
            sum=0;
            for (int j=1;j<i;j++){
                if (i%j==0){
                    sum+=j;
                }
            }
            if (sum==i){
                System.out.println(i);
            }
        }

我們還可以借用一下數學的幫助,凡是一個數開方後的數的素數都是原來那個數的素數,至於最後的加一是因為迴圈是從2開始的,1是任何數的因數

int sum;
        for (int i=2;i<1000;i++){
            sum=0;
            int sqrt=(int)Math.sqrt(i+1);
            for (int j=2;j<=sqrt;j++){
                if (i%j==0){
                    sum+=j;
                    sum+=i/j;
                }
            }
            if (sum+1==i){
                System.out.println(i);
            }
        }

3.題目:求s = a + aa + aaa + aaaa + aa...a的值,其中a是一個數字。

例如2 + 22 + 222 + 2222 + 22222(此時共有5個數相加),幾個數相加有鍵盤控制。

看到這道題的第一時間想到的思路便是拼接字串,字串轉數字,求和

Scanner scanner=new Scanner(System.in);
        String a=scanner.nextInt()+"";
        int number=scanner.nextInt();
        int result=0;
        for (int i=1;i<=number;i++){
            String s="";
            for (int j=1;j<=i;j++){
                s+=a;
            }
            result+=Integer.valueOf(s);
        }
        System.out.println("結果:"+result);

而後仔細琢磨一下,發現一個規律,每個數都等於前面一個數乘10再加上它本身

 Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int number=scanner.nextInt();
        int result=a;
        int t=a;
        for (int i=1;i<number;i++){
            t=t*10;
            t+=a;
            result+=t;
        }
        System.out.println("結果:"+result);

換一個思路,那這個數列都是原數字乘上1,11,111,1111這樣的一個數列,我們可以構造一個這樣的數列,然後想乘求和

 Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int number=scanner.nextInt();
        int result=0;
        int t=0;
        for (int i=1;i<=number;i++){
            t+=Math.pow(10,i-1);
            System.out.println(t);
            result+=a*t;
        }
        System.out.println("結果:"+result);

4.題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。

這道題非常簡單,主要是明確兩個概念,什麼是最大公約數,什麼是最小公倍數。

最大公約數:兩個數共有的最大因子

最小公倍數:兩個數共有的最小的倍數

找最大公約數從大數找到小數,找最小公倍數從小數找到大數

兩個數最大的公約數最大也就是兩種中較小的那個數,最小就是1

兩個數最小的公倍數最小就是兩數中較大的那個數,最大就是兩數想乘的結果

  Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        for(int i=(a<b?a:b);i>=1;i--){
            if (a%i==0&&b%i==0){
                System.out.println("最大公約數:"+i);
                break;
            }
        }
        for (int i=(a>b?a:b);i<=a*b;i++){
            if (i%a==0&&i%b==0){
                System.out.println("最小公倍數:"+i);
                break;
            }
        }

藉助一下數學思維,我們只需要求出兩個數共有的因數和各自最大的因數,這些數的乘積就等於兩數的最小公倍數

private static void Method2() {
        Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        getPrimeFactor(a,b);
        int min=1;
        System.out.println(integerList);
        for (int i:integerList){
            min*=i;
        }
        System.out.println("最小公倍數:"+min);
    }
    private static void getPrimeFactor(int number1 , int number2 ) {
        for (int i=2;i<=(number1>number2? number1:number2);i++){
            if (number1%i==0&&number2%i==0){
                integerList.add(i);
                getPrimeFactor(number1/i,number2/i);
                break;
            }
            if (i==number1||i==number2){
                integerList.add(number1);
                integerList.add(number2);
            }
        }
    }

還可以不斷對較小的那個數取餘,直到取到餘數為0,此時的數就是兩個數的最大公約數,用兩數想乘的結果除以這個結果便是最小公倍數了

private static void Method3() {
        int a,b,m,n;
        Scanner in=new Scanner(System.in);
        System.out.println("請輸入一個正整數:");
        a=in.nextInt();
        System.out.println("再輸入一個正整數:");
        b=in.nextInt();
        m=commonDivisor((a>b? a:b),(a<b? a:b));
        n=a*b/m;
        System.out.println("最大公約數:"+m);
        System.out.println("最小公倍數:"+n);
    }

    public static int commonDivisor(int x,int y){
        while(y!=0){
            int k=x%y;
            x=y;
            y=k;
        }
        return x;
    }