1. 程式人生 > >華為線上程式設計題系列-6-質數因子

華為線上程式設計題系列-6-質數因子

問題描述:

問題描述
問題描述

1. 問題涉及知識點.

  • 素數的求解( 複習閏年,水仙花,迴文數).

2. 自己解法.

  • 迴圈去輸入
  • 單個計算輸入. 每次尋找能整數的最小的素數.
  • 使用stringBuilder構造結構.
package com.chaoxiong.niuke.huawei;
import java.util.Scanner;
public class HuaWei_6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while
(scanner.hasNext()) { long in = scanner.nextLong(); String result = getResult(in); System.out.println(result); } } private static String getResult(long key) { long[] intArr = new long[64]; int intArrIndex = 0; while (key != 1
) { // 輾轉的向下除 if ((key & 1) == 0) { // 可以整數2的每次除以2 intArr[intArrIndex] = 2; intArrIndex = intArrIndex + 1; key = key / 2; } else { // 不能整數2的尋找可以整除的素數 for (int i = 3; i <= key; i = i + 2
) { if (isPrime(i)) { if (key % i == 0) { intArr[intArrIndex] = i; intArrIndex = intArrIndex + 1; key = key / i; break; } } } } } StringBuilder tmp = new StringBuilder(); for (int i = 0; i < intArrIndex; i++) { tmp.append(intArr[i]).append(" "); } return tmp.toString(); } private static boolean isPrime(int key) { if(key==2)//2是最小的素數. return true; if (key > 2 && (key & 1) == 0)//大於2的偶數都不是素數 return false; for (int i = 3; i * i <= (key); i += 2)//大於2的一直到根號下本身都沒有約數的為素數. if (key % i == 0) return false; return true; } }

3. 優質答案.

null

4. 本題總結.

  • 求素數
    private static boolean isPrime(int key) {
        if(key==2)//2是最小的素數.
            return true;
        if (key > 2 && (key & 1) == 0)//大於2的偶數都不是素數
            return false;
        for (int i = 3; i * i <= (key); i += 2)//大於2的一直到根號下本身都沒有約數的為素數.
            if (key % i == 0)
                return false;
        return true;
    }
  • 求迴文數

    設n是一任意自然數。若將n的各位數字反向排列所得自然數n1與n相等,則稱n為一回文數。例如,若n=1234321,則稱n為一回文數;但若n=1234567,則n不是迴文數。

    解法1:把int轉換成string,獲得長度直接使用string.charAt(index)前後取對比.
    解法2:把int轉換成string,然後使用StringBuffer.reverse(),得到翻轉字串.再把string轉為int,直接對比是否相等.
    解法3:把int轉換成string,然後使用StringBuffer.reverse(),得到翻轉字串.使用string.charAt(index)對比字元.
    總的來說還是使用字串比較簡單.

package com.chaoxiong.ClassicsProblem;
import java.util.Scanner;
/**
 * Create by tianchaoxiong on 18-5-2.
 * 迴文數
 */
public class PalindromeNum {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            int key = scanner.nextInt();
            boolean result = isPalindrome(key);
            System.out.println(result);
        }
    }
    private static boolean isPalindrome(int key) {
        String strKey = key+"";
        // 解法3
//        StringBuilder stringBuilder = new StringBuilder(strKey);
//        stringBuilder.reverse();
//        for(int i=0;i<strKey.length()/2;i++){
//            if(strKey.charAt(i)!=stringBuilder.charAt(i))
//                return false;
//        }
//        return true;
        //解法1
        for(int i=0;i<strKey.length()/2;i++){
            if(strKey.charAt(i)!=strKey.charAt(strKey.length()-1-i))
                return false;
        }
        return true;
    }
}

  • 求水仙花數
水仙花數(Narcissistic number)也被稱為超完全數字不變數(pluperfect digital invariant, PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong number),水仙花數是指一個 n 位數(n≥3 ),它的每個位上的數字的 n 次冪之和等於它本身(例如:1^3 + 5^3+ 3^3 = 153)。
package com.chaoxiong.ClassicsProblem;
import java.util.Scanner;
/**
 * Create by tianchaoxiong on 18-5-2.
 * 水仙花數
 */
public class Narcissistic {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            int key = scanner.nextInt();
            boolean result = isNar(key);
            System.out.println(result);
        }
    }
    private static boolean isNar(int key) {
        // 做一個n次冪的累加
        String strKey = key+"";
        int keyBack = key;
        int cout =0;
        for(int i=0;i<strKey.length();i++){
            int tmp = key%10;
            key = key/10;
            cout = (int) (cout+Math.pow(tmp,strKey.length()));
        }
        return keyBack==cout;
    }
}

  • 判斷閏年
能被4整除並且不能被100整除的是閏年能被400整除的也是閏年
package com.chaoxiong.ClassicsProblem;
import java.util.Scanner;
/**
 * Create by tianchaoxiong on 18-5-2.
 */
public class LeapYear {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            int key = scanner.nextInt();
            boolean result = isLeapYear(key);
            System.out.println(result);
        }
    }

    private static boolean isLeapYear(int key) {
        return key%4==0&&key%100!=0||key%400==0;
    }
}