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);
	}
}














  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值