1.寫個程序热幔,它讀取一個整數(shù)并以二進制、八進制和十六進制輸出讼庇。以十六進制浮點數(shù)輸出倒數(shù)绎巨。
參考答案:
package com.example;
import java.math.BigDecimal;
import java.math.MathContext;
import java.util.Scanner;
public class LearnJava {
public static void main(String[] args) {
System.out.print("Please enter an Integer: ");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
Integer number = scanner.nextInt();
System.out.println("Binary output: " + Integer.toString(number, 2));
// method 0
System.out.println("Octal output: 0" + Integer.toString(number, 8));
System.out.println("Hexadecimal output: 0x"
+ Integer.toString(number, 16).toUpperCase());
// method 1
System.out.printf("Octal output: 0%o\n", number);
System.out.printf("Hexadecimal output: 0x%X\n", number);
// method 0
BigDecimal bigDecimal = new BigDecimal("1.0").divide( new BigDecimal(number),
MathContext.DECIMAL64);
System.out.println(bigDecimal);
System.out.printf("Hexadecimal Inverse output: %A\n", bigDecimal.doubleValue());
// method 1
System.out.println(1.0/number);
System.out.printf("Hexadecimal Inverse output: %A\n", 1.0/number);
}
}
}
其中 “1.0/number” 的值依賴于編譯器,也就是說這個值是平臺相關(guān)的蠕啄,而 “BigDecimal("1.0").divide( new BigDecimal(number), MathContext.DECIMAL64);” 的值场勤,則依賴于上述代碼中 “MathContext.DECIMAL64” 對應(yīng)的這個參數(shù)的取值,也就是平臺無關(guān)的歼跟。在上述代碼中和媳,它們的值之所以是相同的,是因為 toby 的電腦系統(tǒng)是 64 位的 Ubuntu 系統(tǒng)哈街。
01題輸出效果:
2.寫個程序留瞳,它讀取整數(shù),然后經(jīng)過模運算轉(zhuǎn)換為 0° ~ 359° 之間的值骚秦。首先以操作符 % 完成她倘,然后再試 floorMod。
參考答案:
package com.example;
import java.util.Scanner;
public class LearnJava {
public static void main(String[] args) {
System.out.println("Please enter a radian: ");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
Integer number = scanner.nextInt();
// method 0
System.out.println("The effective radian value is: " + (number % 360));
// method 1
System.out.println("The effective radian value is: " + Math.floorMod(number, 360));
System.out.println("Please enter a radian: ");
}
}
}
02題輸出效果:
03.只用條件操作符骤竹,寫一個程序帝牡,讀取三個整數(shù)并輸出最大的。使用 Math.max 實現(xiàn)同樣的功能蒙揣。
參考答案:
package com.example;
import java.util.Scanner;
public class LearnJava {
public static void main(String[] args) {
System.out.print("Please enter first Integer: ");
Scanner scanner = new Scanner(System.in);
boolean enterDataOk = false;
if (scanner.hasNextInt()) {
Integer number0 = scanner.nextInt();
System.out.print("Please enter second Integer: ");
if (scanner.hasNextInt()) {
Integer number1 = scanner.nextInt();
System.out.print("Please enter third Integer: ");
if (scanner.hasNextInt()) {
enterDataOk = true;
Integer number2 = scanner.nextInt();
// method 0
int result = number0 > number1 ? number0 : number1;
result = result > number2 ? result : number2;
System.out.println("The max value is: " + result);
// method 1
System.out.println("The max value is: "
+ Math.max(Math.max(number0, number1), number2));
}
}
}
if (!enterDataOk) {
System.out.print("Input data failed!");
}
}
}
03題輸出結(jié)果:
04.寫個程序靶溜,輸出 double 類型中的最小正數(shù)值和最大正數(shù)值。提示:在 Java API 文檔中查詢 Math.nextUp
參考答案:
package com.example;
public class LearnJava {
public static void main(String[] args) {
System.out.println("The max positive number: "
+ Math.nextDown(Double.POSITIVE_INFINITY));
System.out.println("The min positive number: " + Math.nextUp(0));
}
}
04題輸出結(jié)果:
05.當你將一個 double 類型的值轉(zhuǎn)換為 int 類型的值懒震,并且該值大于最大可能的 int 值時罩息,會發(fā)生什么?試試看个扰。
參考答案:
package com.example;
public class LearnJava {
public static void main(String[] args) {
double normalDouble = 123456.789D;
System.out.println("The normal double number: " + normalDouble);
int normalValue = (int) normalDouble;
System.out.println("The int value of the normal double number: " + normalValue);
double maxDouble = Math.nextDown(Double.POSITIVE_INFINITY);
System.out.println("The max positive number: " + maxDouble);
int intValue = (int) maxDouble;
System.out.println("The int value of the max positive number: " + intValue);
}
}
05題輸出結(jié)果:
由輸出可見瓷炮,如果 Double 類型的數(shù)據(jù)較大的話,強制轉(zhuǎn)換將數(shù)據(jù)截短了递宅,只保留了 Integer 類型能夠表示的最大數(shù)值娘香。關(guān)于 “2147483647” ,它是 2147483646 與 2147483648 之間的自然數(shù)办龄,也是歐拉在 1772 年所發(fā)現(xiàn)的一個梅森素數(shù)烘绽,它等于 2^31-1,是 32 位操作系統(tǒng)中最大的符號型整型常量俐填。
06.寫個程序安接,計算階乘 n! = 1 × 2 × ... × n,使用 BigInteger英融。計算 1000 的階乘盏檐。
參考答案:
package com.example;
import java.math.BigInteger;
public class LearnJava {
private static BigInteger factorial(BigInteger value) {
BigInteger bigInteger = value.subtract(BigInteger.ONE);
if (bigInteger.compareTo(BigInteger.ONE) > 0) {
return value.multiply(factorial(bigInteger));
}
return value.multiply(bigInteger);
}
public static void main(String[] args) {
System.out.println("The factorial of 1000 is: "
+ factorial(BigInteger.valueOf(1000)));
}
}
06題輸出結(jié)果:
答案長的有些不像話歇式,上圖其實沒有顯示全,完整的答案是這樣的:
The factorial of 1000 is: 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
足足有 2568 位:
這也可以看出 BigInteger 的強大之處胡野。
07.寫個程序材失,讀取 0~65535 之間的兩個數(shù),在 short 變量中存儲给涕,并計算它們的無符號之和豺憔、之差、之積够庙、之商和余數(shù)恭应,不要將它們轉(zhuǎn)換為 int 類型。
參考答案:
package com.example;
import java.util.Scanner;
public class LearnJava {
private static int toUnsigned(short value) {
return value & 0xFFFF;
}
public static void main(String[] args) {
System.out.print("Please enter first Short(0~65535): ");
Scanner scanner = new Scanner(System.in);
boolean enterDataOk = false;
if (scanner.hasNextInt()) {
short number0 = (short)scanner.nextInt();
System.out.print("Please enter second Short(0~65535): ");
if (scanner.hasNextInt()) {
enterDataOk = true;
short number1 = (short) scanner.nextInt();
System.out.println(toUnsigned(number0) + " + " + toUnsigned(number1)
+ " = " + (toUnsigned(number0) + toUnsigned(number1)));
System.out.println(toUnsigned(number0) + " - " + toUnsigned(number1)
+ " = " + (toUnsigned(number0) - toUnsigned(number1)));
System.out.println(toUnsigned(number0) + " * " + toUnsigned(number1)
+ " = " + (toUnsigned(number0) * toUnsigned(number1)));
System.out.println(toUnsigned(number0) + " / " + toUnsigned(number1)
+ " = " + (toUnsigned(number0) / toUnsigned(number1)));
}
}
if (!enterDataOk) {
System.out.print("Input data failed!");
}
}
}
07題輸出結(jié)果:
08.寫個程序耘眨,讀取一個字符串并輸出該字符串所有的非空子字符串昼榛。
參考答案:
package com.example;
public class LearnJava {
public static void main(String[] args) {
String testStr = "Please enter\n first\t Short (0~65535): ";
String[] testStrArray = testStr.split("\\s+");
for (String t : testStrArray) {
System.out.println("Child String: " + t);
}
}
}
08題輸出結(jié)果:
09.“1.5.3” 節(jié)中有個例子,兩個字符串 s 和 t剔难,雖然 s.equals(t) 為真胆屿,但是 s != t 。找出不使用 substring 方法的不同例子偶宫。
參考答案:
package com.example;
public class LearnJava {
public static void main(String[] args) {
String testStr = "Please enter\n first\t Short (0~65535): ";
String[] testStrArray = testStr.split("\\s+");
for (String t : testStrArray) {
System.out.println("Child String: " + t);
}
System.out.println("testStrArray[0] == \"Please\" result: "
+ (testStrArray[0] == "Please") );
System.out.println("testStrArray[0].equals(\"Please\") result: "
+ testStrArray[0].equals("Please") );
}
}
09題輸出結(jié)果:
10.寫個程序非迹,先產(chǎn)生隨機的 long 型整數(shù),然后模 36纯趋,最后輸出由字母和數(shù)字組成的隨機字符串憎兽。
參考答案:
package com.example;
import java.util.Random;
public class LearnJava {
public static void main(String[] args) {
Random random = new Random();
random.setSeed(System.currentTimeMillis());
String chars = "abcdefghijklmnopqrstuvwxyz0123456789";
String outputStr = "";
for (int i=0; i<36; ++i) {
int index = Math.abs((int)(random.nextLong()%36));
outputStr += chars.charAt(index);
}
System.out.println("outputStr: " + outputStr);
}
}
10題輸出結(jié)果:
11.寫個程序,讀取一行文本并輸出所有非 ASCII 字符吵冒,以及它們的 Unicode 值纯命。
參考答案:
package com.example;
public class LearnJava {
private static String toUnicodeExcludeAscii(String str) {
StringBuilder retStr = new StringBuilder();
for(int i=0; i<str.length(); i++) {
int cp = Character.codePointAt(str, i);
int charCount = Character.charCount(cp);
if (charCount > 1) {
i += charCount - 1; // 一些 unicode 字符跨越兩個 Java 字符。
if (i >= str.length()) {
throw new IllegalArgumentException("truncated unexpectedly");
}
}
if (cp > 128) {
retStr.append(String.format("\\u%x", cp));
}
}
return retStr.toString();
}
private static String unicodeToNormal(String str) {
StringBuilder retStr = new StringBuilder();
String[] unicodeArray = str.split("\\\\u");
for (String aChar : unicodeArray) {
if (aChar.isEmpty()) {
continue; // 第一個 aChar 為空
}
int data = Integer.parseInt(aChar, 16);
retStr.append((char) data);
}
return retStr.toString();
}
public static void main(String[] args) {
String testStr0 = "ASCII(American Standard Code for Information Interchange痹栖,\n" +
"美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)亿汞,主要用于顯示現(xiàn)代英語和\n" +
"其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng)揪阿,并等同于國際標準ISO/IEC 646疗我。\n";
String testStr1 = toUnicodeExcludeAscii(testStr0);
System.out.println("toUnicodeExcludeAscii: " + testStr1);
System.out.println("unicodeToNormal: " + unicodeToNormal(testStr1));
}
}
11題輸出結(jié)果:
注意:本題中我們要考慮到一些 unicode 字符跨越兩個 Java 字符的問題。
12.JDK(Java 開發(fā)工具箱)包含一個 src.zip 文件南捂,該文件有 Java 庫的源代碼碍粥。解壓該文件,用你喜歡的文本搜索工具黑毅,找到帶標簽的 break 和 continue 的用法。選擇其中一個并使用不帶標簽的聲明重寫钦讳。
參考答案:
package com.example;
public class LearnJava {
private static void testBreakWithTag(){
int i = 0;
outer:
while (true)
{
System.out.print("Pass "+(i++)+":");
for(int j=0; j<100; j++)
{
if(j==10)
break outer;
System.out.print(j+" ");
}
// 如果帶標簽矿瘦,那么下面的兩行代碼不會被執(zhí)行
System.out.println();
System.out.println("HA HA HA HA ...");
}
System.out.println("loops complete.");
}
private static void testBreakNoTag(){
int i=0;
int j=0;
while (j<10) {
System.out.print("Pass "+(i++)+":");
for(; j<100; j++)
{
if(j==10)
break;
System.out.print(j+" ");
}
System.out.println();
System.out.println("HA HA HA HA ...");
}
System.out.println("loops complete.");
}
private static void testContinueWithTag(){
int i=0;
int j=0;
outer:
while (j<10)
{
System.out.print("Pass "+(i++)+":");
for(; j<100; j++)
{
if(j==10)
continue outer;
System.out.print(j+" ");
}
// 如果帶標簽枕面,那么下面的兩行代碼不會被執(zhí)行
System.out.println();
System.out.println("HA HA HA HA ...");
}
System.out.println("loops complete.");
}
private static void testContinueNoTag(){
System.out.print("Pass "+0+":");
for(int j=0; j<10; j++)
{
System.out.print(j+" ");
}
System.out.println("loops complete.");
}
public static void main(String[] args) {
testBreakWithTag();
testBreakNoTag();
testContinueWithTag();
testContinueNoTag();
}
}
12題輸出結(jié)果:
這個是自己寫的示例,可能不是很合理缚去,也歡迎大家補充潮秘。
13.寫個程序,可以輸出一組彩票組合易结,該組合由 1~49 之間的 6 個不同數(shù)字組成枕荞。為產(chǎn)生 6 個不同數(shù)字,先用 1~ 49 填充一個數(shù)組搞动。然后隨機選擇一個索引并刪除對應(yīng)元素躏精,重復(fù) 6 次,并輸出排序后的結(jié)果鹦肿。
參考答案:
package com.example;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class LearnJava {
public static void main(String[] args) {
List<Integer> integers = new ArrayList<>();
for (int i=1; i<50; ++i) {
integers.add(i);
}
Random random = new Random();
random.setSeed(System.currentTimeMillis());
StringBuilder stringBuilder = new StringBuilder();
for (int i=0; i<6; ++i){
stringBuilder.append(integers.remove(random.nextInt(integers.size() - 1)));
if (i < 5) {
stringBuilder.append(" ");
}
}
System.out.println("The result is: " + stringBuilder.toString());
}
}
13題輸出結(jié)果:
14.寫個程序矗烛,讀取整型的二維數(shù)組并判斷它是否是魔方(也就是,所有的行之和箩溃、列之和瞭吃,以及對角線之和都是相同的)。接受可以分隔成單個整數(shù)的行輸入涣旨,當用戶輸入空白行時停止歪架。例如,如下輸入
16 3 2 13
3 10 11 8
9 6 7 12
4 15 14 1
(空白行)
程序應(yīng)該確認用戶輸入的數(shù)組是否為魔方霹陡。
參考答案:
package com.example;
import java.util.ArrayList;
import java.util.Scanner;
public class LearnJava {
public static void main(String[] args) {
System.out.println("Please enter first numbers Line: ");
Scanner scanner = new Scanner(System.in);
ArrayList<Long> rowSums = new ArrayList<>();
ArrayList<Long> columnSums = new ArrayList<>();
Long leftTopToRightBottomSum = 0L;
Long rightTopToLeftBottomSum = 0L;
boolean enterDataOk = false;
int columnCount = -1;
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
String[] numbers = line.split(" ");
if (numbers.length <= 1) {
break; // 無輸入或者只輸入一個數(shù)字時和蚪,直接退出
}
if (-1 == columnCount) {
columnCount = numbers.length;
} else {
if (columnCount != numbers.length) {
break; // 新輸入的行的數(shù)字個數(shù)少于或者
// 多于第一行數(shù)字的個數(shù)時,直接退出
}
}
long rowSum = 0;
for (int i=0; i<columnCount; ++i) {
Long numberValue = Long.valueOf(numbers[i]);
Long columnSum = (columnSums.size() <= i ? 0L : columnSums.get(i));
if (columnSums.size() <= i) {
columnSums.add(columnSum + numberValue);
} else {
columnSums.set(i, columnSum + numberValue);
}
rowSum += numberValue;
}
leftTopToRightBottomSum += Long.valueOf(numbers[rowSums.size()]);
rightTopToLeftBottomSum += Long.valueOf(
numbers[columnCount - rowSums.size() - 1]);
rowSums.add(rowSum);
if (rowSums.get(0) != rowSum) {
break; // 出現(xiàn)新的行的和與第一行的和不相同時穆律,直接退出
}
if (rowSums.size() == columnCount) {
Long allSums = 0L;
for (Long columnSum : columnSums) {
allSums += columnSum;
}
enterDataOk = (allSums/columnCount == rowSums.get(0))
&& leftTopToRightBottomSum.equals(rightTopToLeftBottomSum);
break; // 行數(shù)與列數(shù)相同達到魔方要求惠呼,直接退出
}
}
if (!enterDataOk) {
System.out.println("this is not a Rubik's cube!");
} else {
System.out.println("this is a Rubik's cube, Congratulations!");
}
}
}
14題輸出結(jié)果:
15.寫個程序,在 ArrayList<ArrayList<Integer>> 中存儲給定 n 的帕斯卡三角形峦耘。
什么是帕斯卡(也叫楊輝)三角形剔蹋?從下面的動態(tài)圖片就很簡單明了地知道了:
參考答案:
package com.example;
import java.util.ArrayList;
import java.util.Scanner;
public class LearnJava {
public static void main(String[] args) {
System.out.println("Please enter an Integer:");
Scanner scanner = new Scanner(System.in);
ArrayList<ArrayList<Integer>> pascalTriangle = new ArrayList<>();
if (scanner.hasNextInt()) {
Integer n = scanner.nextInt();
if (n >= 1) {
ArrayList<Integer> data = new ArrayList<>();
data.add(1);
pascalTriangle.add(data);
}
if (n >= 2) {
ArrayList<Integer> data = new ArrayList<>();
data.add(1);
data.add(1);
pascalTriangle.add(data);
}
for (int i = 3; i <=n; i++) {
ArrayList<Integer> data = new ArrayList<>();
ArrayList<Integer> prev = pascalTriangle.get(i - 2);
data.add(1);
for (int j = 2; j <= i -1; j++) {
data.add(prev.get(j - 2) + prev.get(j - 1));
}
data.add(1);
pascalTriangle.add(data);
}
}
System.out.println("Pascal Triangle:");
for (ArrayList<Integer> data : pascalTriangle) {
System.out.println(data.toString());
}
}
}
15題輸出結(jié)果:
16.改進 average 方法,使得調(diào)用該方法辅髓,至少有一個參數(shù)泣崩。
這個題,洛口,矫付,,第焰,买优,略,,杀赢,烘跺,,額脂崔,主要是我也沒想好要加什么參數(shù)合適滤淳。