Java經典五十道題31-40

【程序31】 
題目:將一個數組逆序輸出。 
1.程序分析:用第一個與最後一個交換。




【程序32】 
題目:取一個整數a從右端開始的4~7位。 
程序分析:可以這樣考慮: 
(1)先使a右移4位。 
(2)設置一個低4位全爲1,其餘全爲0的數。可用~(~0<<4) 
(3)將上面二者進行&運算。




【程序33】 
題目:打印出楊輝三角形(要求打印出10行如下圖) 
1.程序分析:  
       1 
      1 1 
     1 2 1 
    1 3 3 1 
   1 4 6 4 1 
1 5 10 10 5 1




【程序34】 略 前面更復雜的已經做過了 
題目:輸入3個數a,b,c,按大小順序輸出。 
1.程序分析:利用指針方法。




【程序35】 
題目:輸入數組,最大的與第一個元素交換,最小的與最後一個元素交換,輸出數組。




【程序36】  
題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數




【程序37】 
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下 
的是原來第幾號的那位。




【程序38】 
題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,並輸出其長度。
問題分析:有現成的,不寫了。




【程序39】 
題目:編寫一個函數,輸入n爲偶數時,調用函數求1/2+1/4+...+1/n,當輸入n爲奇數時,調用函數 
1/1+1/3+...+1/n(利用指針函數)
問題分析:Java裏面沒有指針,用遞歸很好解決,這在前面有幾個遞歸的例子,不寫了



【程序40】  

題目:字符串排序。   這個也不寫了,Java有現成的。

package javaimprove031;

import java.util.Scanner;

/*
 * 【程序31】 
題目:將一個數組逆序輸出。 
問題分析:只是要求輸出,就可以偷懶啦!
 */
public class Converse {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入數組大小:");
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int[] arr=new int[n];
		for(int i=0;i<n;i++)
		{
			arr[i]=in.nextInt();
		}
		for(int j=n-1;j>=0;j--)
		{
			System.out.printf("%d ",arr[j]);
		}
	}

}

package javaimprove032;

import java.util.Scanner;

/*
 * 
【程序32】 Ex32.java 
題目:取一個整數a從右端開始的4~7位。 
程序分析:可以這樣考慮: 
(1)先使a右移4位。 
(2)設置一個低4位全爲1,其餘全爲0的數。可用~(~0<<4) 
(3)將上面二者進行&運算。
 */
public class RightShift {

	/**
	 * @param args
	 */
	public static void main(String[] arigs) {
		// TODO Auto-generated method stub
		System.out.println("請輸入一個整數:");
		Scanner in=new Scanner(System.in);
		int a=in.nextInt();
		System.out.println(Integer.toBinaryString(a));
		 int a1=a>>4;
		System.out.println(Integer.toBinaryString(a1));
		int a2=~0;
		a2=~(a2<<4);
		System.out.println(Integer.toBinaryString(a2));
		System.out.println(Integer.toBinaryString(a1&a2));
	}

}

package javaimprove033;

import java.util.Scanner;

/*
 * 【程序33】YangHui.java 
題目:打印出楊輝三角形(要求打印出10行如下圖) 
1.程序分析:  
       1 
      1 1 
     1 2 1 
    1 3 3 1 
   1 4 6 4 1 
1 5 10 10 5 1
查一查楊輝三角的規律,或者僅僅是看,應該也能看出楊輝三角的規律來打印得到一個三角形的圖形,
 */
public class Yanghui {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入您需要打印的楊輝三角的高度:");
		Scanner in=new Scanner(System.in);
		int size=in.nextInt();
		int[][] a=new int[size][2*size-1];
		//第一行
		for(int j=0;j<2*size-1;j++)
		{
			if(j==(2*size-1)/2)
				a[0][j]=1;
			else
				a[0][j]=0;
		}
		//第一列和最後一列
		for(int i=1;i<size;i++)
		{
			if(i==size-1)
			{
				a[i][0]=1;
				a[i][2*(size-1)]=1;
			}
			else
			{
				a[i][0]=0;
			}
		}
		for(int i=1;i<size;i++)
		{
			for(int j=1;j<2*(size-1);j++)
			{
				//在這裏如果不對矩陣的第一行、第一列和最後一列進行單獨處理,
				//那麼在矩邊界元素應用這個規律必然會導致溢出
				a[i][j]=a[i-1][j-1]+a[i-1][j+1];
			}
		}
		//打印
		for(int i=0;i<size;i++)
		{
			for(int j=0;j<2*(size)-1;j++)
			{
				if(a[i][j]==0)
					System.out.print("  ");
				else
					System.out.printf("%2d",a[i][j]);
				//當高度太大,和達到三位數的時候,得到的圖形又歪了,
				//但是把輸出格式改一改,得到的圖形還是能是正的。
				//在這裏稍微做點改動或者是直接判斷是不是三位數或者更多位數選擇輸出格式也可以,我就不幹了。
			}
			System.out.println();
		}
	}

}

package javaimprove034;

import java.util.Scanner;

/*
 * 【程序34】 略 前面更復雜的已經做過了 
題目:輸入3個數a,b,c,按大小順序輸出。 
1.程序分析:這個前面有,這裏用平時的法子
 */
public class Coommpare {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("請輸入三個要比較大小的數:");
		Scanner in=new Scanner(System.in);
		int a=in.nextInt();
		int b=in.nextInt();
		int c=in.nextInt();
		int max;
		if(a>=b)
		{
			max=a;
			a=b;
			b=max;//交換位置
		}
		if(a>=c)
		{
			max=a;
			a=c;
			c=max;
		}
		if(b>=c)
		{
			max=b;
			b=c;
			c=max;
		}
		System.out.printf("%d\t%d\t%d\n", a,b,c);
	}

}

package javaimprove035;

import java.util.Arrays;
import java.util.Scanner;

/*
 * 
 * 【程序35】 ArrayChange.java 
題目:輸入數組,最大的與第一個元素交換,最小的與最後一個元素交換,輸出數組。
 */
public class Change {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入數組大小以及元素:");
		Scanner in=new Scanner(System.in);
		int size=in.nextInt();
		System.out.println("----");
		int[] arr=new int[size];
		int max,min;
		for(int i=0;i<size;i++)
		{
			arr[i]=in.nextInt();
		}
		in.close();
		max=arr[0];
		min=arr[0];
		for(int j=1;j<size;j++)
		{
			if(arr[j]>max)
				max=arr[j];
			if(arr[j]<min)
				min=arr[j];				
		}
		arr[0]=max;
		arr[size-1]=min;
		System.out.println(Arrays.toString(arr));
	}

}

package javaimprove036;

import java.util.Arrays;
import java.util.Scanner;

/*
 * 
 * 【程序36】 Array1.java 
題目:有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數
問題分析:後移之後的數組下標可以通過對size進行模數取餘得到
 */
public class Backward {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入數組大小以及元素:");
		Scanner in=new Scanner(System.in);
		int size=in.nextInt();
		int[] arr=new int[size];
		int[] arr1=new int[size];//這是一個放結果的數組,當然也可以不用
		for(int i=0;i<size;i++)
		{
			arr[i]=in.nextInt();
		}
		System.out.println("請輸入後移的位數:");
		int m=in.nextInt();
		for(int i=0;i<size;i++)//用上存放結果的數組
		{
			arr1[(i+m)%size]=arr[i];
		}
		System.out.println(Arrays.toString(arr1));

	}

}
package javaimprove037;

import java.util.Scanner;

/*
 * 【程序37】 
題目:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最後留下 
的是原來第幾號的那位。
問題分析:其實也就是當時三的倍數的時候就刪除,完了這一輪再來一輪,而且注意是圍成圓圈的,
一直到最後剩下的人再也形成不了圓圈停止報號,也就是只剩下一個,這個時候求的是剩下的這一個是原來的幾號。
百度上有的的解法是不正確的,在每一輪刪除人選之後,第二輪的數組的大小已經是改變了的,
那麼數組是不斷的縮小的,而不是將值賦false,再來一輪也沒有把false剔除出去。
這個遊戲也叫猴子選大王
 */
public class Circleplay {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入數組的大小:");
		Scanner in=new Scanner(System.in);
		int size=in.nextInt();
		int[] arrn=new int[size];
		int left=size;
		for(int i=0;i<size;i++)
		{
			arrn[i]=i;//這樣,當我們得到最後剩下的是arrn【index】是幾,那麼就是原來的幾號。
		}
		int counter=0;//計數器
		int index=0;//數組索引
		while(left!=1)
		{//
			if(arrn[index]!=-1)//只有當數組元素不是被標記的已刪除,已經標記了的,我們跳過啥也不幹
			{
				counter++;
				if(counter==3)//計數器爲3,這個時候刪除
				{
					counter=0;//計數器清零
					//將刪除的數組元素記爲-1,與數組的其他元素區別開來
					//這樣也不會導致在這一輪的循環中數組長度發生改變
					arrn[index]=-1;
					left=left-1;//剩下的人減少了一個
				}
			}
			index++;
			if(index==size)
			{
				index=0;//又一輪開始了
			}			
		}//
		for(int i=0;i<size;i++)
		{
			//在這裏,我們完成選數之後,也可以循環輸出不是標記爲-1的元素的數組下標,
			//這樣的話,數組裏面想存什麼存什麼,輸出的也是要求的多少多少號。
			if(arrn[i]!=-1)//因爲是從零計數,因此可能我們看起來會不太習慣,我們加一,得到正常從一計數
				System.out.printf("剩下的是原來你數組的第%d號。",arrn[i]+1);
		}
	}

}

package javaimprove038;

import java.util.Scanner;

/*
 * 【程序38】 TestLength.java 
題目:寫一個函數,求一個字符串的長度,在main函數中輸入字符串,並輸出其長度。
問題分析:這個在字符串中有長度函數,如果使用C語言,可以用char數組或者是指針。
 */
public class Stringl {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("請輸入你要計算長度的字符串:");
		Scanner in=new Scanner(System.in);
		String str=in.nextLine();
		System.out.println(str.length());
		//System.out.println(str.toCharArray().length);
	}
}














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