Java基本功練習一(蒙特卡羅模擬,畫出指定金字塔圖形,分解質因數等)

       通過這幾個列子來展示和考察自己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);
		}
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章