通過這幾個列子來展示和考察自己Java編程的基本功,不要以爲簡單,如果基礎不夠紮實,很難在短時間內解決以下問題,所以如果基礎一般,還是動手認真實踐一下,然後再參考我的解法(不一定是最好的解法,但也是我第一次接觸編程題目,自己慢慢實踐出來的,希望讀者童鞋們也自己動手實踐以下)
示例一:蒙特卡羅模擬。假設這個圓的半徑是1,那麼圓面積就是圓周率,而外接正方形面積爲4。現隨便產生一個正方形中的一個點,這個點落在圓內的概率爲圓周率除以4。編寫程序,在正方形內隨機產生一百萬個點,用numberOfHits表示落在圓內的點,因此圓周率可以用4*numberOfHits/1000000來近似估算,選取的點越多,精度越高。這就是蒙特卡羅模擬,是一種重要的思想方法。下面是實現代碼和運行結果展示:
package prcatice4;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class Practice4 {
public static void main(String[] args) {
//蒙特卡羅模擬
final int NUMBER_OF_TRIALS = 1000000;
int numberOfHits = 0;
for(int i = 0;i < NUMBER_OF_TRIALS;i++){
double x = Math.random()*2.0-1;
double y = Math.random()*2.0-1;
if(x*x+y*y<=1)
numberOfHits++;
}
double pi = 4.0*numberOfHits/NUMBER_OF_TRIALS;
System.out.println("PI is "+pi);
}
}
運行結果:可以看到運行結果並不是十分準確,那是因爲產生的隨機點不夠多導致。
示例二:提示用戶輸入一個1到15之間的整數,然後顯示一個金字塔形狀的圖案,先給出運行效果圖,然後根據效果圖的要求設計程序。
效果圖:此效果是輸入14得到的圖形。
要解決此問題,可以將其分解成若干個小問題,比如先畫出左半邊,再畫出右半邊,然後將兩個合併整合。還可以“畫出”各種金字塔的程序。下面就將我思考的方式和代碼展示如下:
package Class;
import java.util.Scanner;
public class chengxu {
public static void main(String[] args) {
//畫各種金字塔的程序
Scanner input = new Scanner(System.in);
System.out.print("Enter an integer between 1 and 15 :");
int n = input.nextInt();
//左金字塔
int count = 1;
for(int i = 1;i <=n;i++){
for(int j = n;j>=1;j--){
if(count <= n-i){
System.out.print(" ");
count++;
}
else{
System.out.printf("%2d",j);
System.out.print(" ");
}
}
count = 1;
System.out.println();
}
//右金字塔
for(int i = 1;i <= n;i++){
for(int j = 1;j <= i;j++){
System.out.printf("%2d",j);
System.out.print(" ");
}
System.out.println();
}
//整個金字塔
int countFront = 1;
for(int i = 1;i <=n;i++){
int out = i;
for(int j = 1;j <= 2*n-1;j++){
if(countFront <= n-i || countFront >=n+i ){
System.out.print(" ");
}
else{
if(j <=n){
System.out.printf("%2d",out);
System.out.print(" ");
out--;
}
if(j > n){
System.out.printf("%2d",out+2);
System.out.print(" ");
out++;
}
}
countFront++;
}
countFront = 1;
System.out.println();
}
//右金字塔翻版倒影
for(int i = n;i >= 1;i--){
for(int j = 1;j <= i;j++){
System.out.printf("%2d",j);
System.out.print(" ");
}
System.out.println();
}
//斜對角數字一樣的左金字塔
for(int i = n;i >= 1;i--){
int cnt = 1;
for(int j = 1;j <= n;j++){
if(cnt <= n-i){
System.out.print(" ");
cnt++;
}
else{
System.out.printf("%2d",j-n+i);
System.out.print(" ");
}
}
System.out.println();
}
}
}
學習完上述程序之後,有一個變種的畫金字塔的題目,現將運行效果圖展示出來,讀者可以自己編程設計出來,以作爲此示例學習的考察。
效果圖:先試試看能否通過上述學習解決此題,先自己研究設計,再看看我的思路和代碼。實現代碼如下:
package Class;
import java.util.Scanner;
public class chengxu {
public static void main(String[] args) {
//指數形式的金字塔
Scanner input = new Scanner(System.in);
System.out.print("Enter an integer between 8:");
int n = input.nextInt();
int countFront = 1;
for(int i = 1;i <=n;i++){
int out = 0;
for(int j = 1;j <= 2*n-1;j++){ //打印每一行
if(countFront <= n-i || countFront >=n+i ){
System.out.print(" ");
}
else{
if(j <=n){
int result = (int)(Math.pow(2, out));
System.out.printf("%3d",result);
System.out.print(" ");
out++;
}
if(j > n){
int result = (int)(Math.pow(2, out-2));
System.out.printf("%3d",result);
System.out.print(" ");
out--;
}
}
countFront++;
}
countFront = 1;
System.out.println();
}
}
}
示例三:分解質因數。就是提示用戶輸入一個整型數,然後輸出這個數由其質因數的乘積得到的等式。不要以爲這個題目簡單,先自己動手試試看。
運行效果如圖所示:注意:先動手再看代碼!
package Class;
import java.util.Scanner;
public class chengxu {
public static void main(String[] args) {
//分解質因數,不要以爲簡單,自己寫寫看
Scanner input = new Scanner(System.in);
System.out.print("Enter an integer: ");
int data = input.nextInt();
int number = 2;
System.out.print(data+"=");
while(number <= data){
if(number == data){
System.out.println(data);
break;
}
else
if(data % number == 0){
System.out.print(number+"*");
data /=number;
}
else
number++;
}
}
}
示例四:提示輸入年份,如2014,則輸出2014年每個月第一天是星期幾。先給出運行效果圖如下:
你能不看答案自己動手設計出來嗎?
程序語言設計沒有捷徑,只有從敲一個代碼一個代碼中熟練起來。
貼出示例四實現代碼如下:
package shiyanPractice;
import java.util.Scanner;
public class ShiYanPractice {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter the number of year: ");
int year = input.nextInt();
int month = 1;
int day = 0;
for(int i = 0;i < 12;i++){
int h,q,m,j,k;
month = i+1;
day = 1;
q = day;
m = month;
//澤勒一致性,如果月份是1或2則要算爲上一年的13或14月,並將年數減一
if(m == 1 || m == 2){
m+=12;
year -= 1;
}
j = year/100; //求出h表示的星期幾,其中0表示週日,1表示週六,2表示週一,...
k = year%100;
h = (q+(int)(26*(m+1)/10.0)+k+(int)(k/4.0)+(int)(j/4.0)+5*j)%7;
//計算完h之後要將year的值加回來
if(month == 1 ||month == 2)
year += 1;
String dayTranslate = "";
switch(h){
case 0:
dayTranslate = "Saturday";
break;
case 1:
dayTranslate = "Sunday";
break;
case 2:
dayTranslate = "Monday";
break;
case 3:
dayTranslate = "Thusday";
break;
case 4:
dayTranslate = "Wednesday";
break;
case 5:
dayTranslate = "Thursday";
break;
case 6:
dayTranslate = "Friday";
break;
}
String monthFor = "";
switch(month){
case 1:
monthFor = "January";
break;
case 2:
monthFor = "February";
break;
case 3:
monthFor = "March";
break;
case 4:
monthFor = "April";
break;
case 5:
monthFor = "May ";
break;
case 6:
monthFor = "June ";
break;
case 7:
monthFor = "July ";
break;
case 8:
monthFor = "August";
break;
case 9:
monthFor = "September";
break;
case 10:
monthFor = "October";
break;
case 11:
monthFor = "November";
break;
case 12:
monthFor = "December";
break;
}
String output = monthFor+" 1,\t"+(int)year+" is\t"+dayTranslate;
System.out.println(output);
}
}
}