華為線上程式設計題系列-6-質數因子
阿新 • • 發佈:2019-01-03
問題描述:
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;
}
}