JAVA练习题

1:

/**
 * 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子, 小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子对数为多少?
 * 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....
 * 
 * @author super
 *
 */
public class Test {

	public static void main(String[] args) {
		for (int i = 1; i <= 20; i++) {
			System.out.println("第" + i + "个月的兔子总数为:" + Rabbit(i));
		}

	}

	// 递归处理
	public static int Rabbit(int n) {
		// 前两个月兔子总数各为1
		if (n == 1 || n == 2) {
			return 1;
		} else {
			// 第三个月开始,每个月兔子总数为上个月和上上个月的和
			return Rabbit(n - 1) + Rabbit(n - 2);
		}
	}
	
}

输出:

第1个月的兔子总数为:1

第2个月的兔子总数为:1

第3个月的兔子总数为:2

第4个月的兔子总数为:3

第5个月的兔子总数为:5

第6个月的兔子总数为:8

第7个月的兔子总数为:13

第8个月的兔子总数为:21

第9个月的兔子总数为:34

第10个月的兔子总数为:55

第11个月的兔子总数为:89

第12个月的兔子总数为:144

第13个月的兔子总数为:233

第14个月的兔子总数为:377

第15个月的兔子总数为:610

第16个月的兔子总数为:987

第17个月的兔子总数为:1597

第18个月的兔子总数为:2584

第19个月的兔子总数为:4181

第20个月的兔子总数为:6765


2:

题目:判断101-200之间有多少个素数,并输出所有素数。

public class Test {

	public static void main(String[] args) {
		GetSuShu(101, 200);

	}

	/***
	 * 获取a,b之间的所有素数并统计输出
	 * 
	 * @param a
	 *            起始数字
	 * @param b
	 *            结束数字
	 */
	public static void GetSuShu(int a, int b) {
		// 统计素数个数
		int count = 0;
		// 外循环遍历既定数字范围
		for (int i = a; i <= b; i++) {
			// 新建一个判断变量
			boolean flag = true;
			// 从2开始到自身依次相除判断是否素数
			for (int j = 2; j < i; j++) {
				// 如果不是素数则改为false并跳出内循环
				if (i % j == 0) {
					flag = false;
					break;
				}
			}
			// 如果遍历结束确定是素数则统计并输出
			if (flag) {
				count++;
				System.out.println("第" + count + "个素数:" + i);
			}
		}
	}
}

输出:

第1个素数:101

第2个素数:103

第3个素数:107

第4个素数:109

第5个素数:113

第6个素数:127

第7个素数:131

第8个素数:137

第9个素数:139

第10个素数:149

第11个素数:151

第12个素数:157

第13个素数:163

第14个素数:167

第15个素数:173

第16个素数:179

第17个素数:181

第18个素数:191

第19个素数:193

第20个素数:197

第21个素数:199


3:

题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

public class Test {

	public static void main(String[] args) {
		// 打印水仙花数
		// 某个n位数字每一位的n次方相加等于n
		// 1^3+5^3+3^=1+125+27=153
		int ShuiSum = 0;
		for (int i = 0; i < 1000; i++) {
			if (i == Math.pow(i % 10, 3) + Math.pow(i / 100, 3) + Math.pow(i / 10 - (i / 100) * 10, 3)) {
				// 个位数字 百位数字 十位数字
				System.out.println(i);
				ShuiSum++;
			}
		}
		System.out.println("共有水仙花数" + ShuiSum + "个");
	}
}

输出:

0

1

153

370

371

407

共有水仙花数6个


4:

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

Test1:

public class Test {

	public static void main(String[] args) {
		// 给定一个测试的数字
		int n = 120;
		// 先输出一个 “120=”
		System.out.print(n + "=");
		// 从2开始遍历该数字的质数
		for (int i = 2; i <= n; i++) {
			// 如果能整除,是质数则继续
			if (n % i == 0) {
				// 是否相同
				if (n == i) {
					// 如果相同则仅输出数字并跳出循环
					System.out.print(i);
					break;
				}
				// 如果不相同说明还可能有后续质数,更新n的值
				n /= i;
				// 输出 当前质数i 并加上* 号
				System.out.print(i + "*");

				// 由于获取最小质数后可能还有相同的一个最小质数,所以需要回滚i变量
				// 由于每次获取到的肯定是当前最小的质数,所以只需要回滚1就可以了
				i--;
			}
		}
	}
}

输出:

120=2*2*2*3*5


Test2:

public classProg4{
    public static void main(String[] args){
        int n = 13;
        decompose(n);
    }
    private static void decompose(int n){
        System.out.print(n+"=");
        for(int i=2;i<n+1;i++){
            while(n%i==0 && n!=i){
                n/=i;
                System.out.print(i+"*");
            }
            if(n==i){
                System.out.println(i);
                break;
            }
        }
    }
}


5

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

程序分析:(a>b)?a:b这是条件运算符的基本例子。

Test:

public class Test {

	public static void main(String[] args) {
		int score = 46;
		String grade = score >= 90 ? "A" : score >= 60 ? "B" : "C";
		System.out.println(grade);
	}
}

输出:

C


Test2:

public class Prog5{
       publicstatic void main(String[] args){
              intn = -1;
              try{
                     n= Integer.parseInt(args[0]);
              }catch(ArrayIndexOutOfBoundsExceptione){
                     System.out.println("请输入成绩");
                     return;
              }
              grade(n);
       }
       //成绩等级计算
       privatestatic void grade(int n){
              if(n>100|| n<0)
                System.out.println("输入无效");
              else{
                String str = (n>=90)?"分,属于A等":((n>60)?"分,属于B等":"分,属于C等");
                System.out.println(n+str);
              }
       }
}


6:

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

Test:

public class Test {

	public static void main(String[] args) {
		int a = 120;
		int b = 90;
		System.out.println(a + "和" + b + "的最大公约数为:" + GetGongYue(a, b));
		System.out.println(a + "和" + b + "的最小公倍数为:" + GetGongBei(a, b));
	}

	/***
	 * 获取两个正整数的最大公约数
	 * 
	 * @param a
	 *            参数
	 * @param b
	 *            参数
	 * @return 两个数的最大公约数
	 */
	public static int GetGongYue(int a, int b) {
		// 初始化最大公约数为较小数字
		int gongYue = (a < b ? a : b);
		// 从较小数字开始向下遍历,满足添加即赋值并跳出循环
		for (int i = gongYue;; i--) {
			if (a % i == 0 && b % i == 0) {
				gongYue = i;
				break;
			}
		}
		return gongYue;
	}

	/***
	 * 获取两个正整数的最小公倍数
	 * 
	 * @param a
	 *            参数
	 * @param b
	 *            参数
	 * @return 两个数字的最小公倍数
	 */
	public static int GetGongBei(int a, int b) {
		// 初始化最小公倍数为较大数字
		int gongBei = (a > b ? a : b);
		// 向上遍历满足条件即赋值并跳出循环
		for (int i = gongBei;; i++) {
			if (i % a == 0 && i % b == 0) {
				gongBei = i;
				break;
			}
		}
		return gongBei;
	}
}

输出:

120和90的最大公约数为:30

120和90的最小公倍数为:360


Test2:

public classProg6{
    public static void main(String[] args){
        int m,n;
        try{
            m = Integer.parseInt(args[0]);
            n = Integer.parseInt(args[1]);
        }catch(ArrayIndexOutOfBoundsExceptione){
            System.out.println("输入有误");
            return;
        }
        max_min(m,n);
    }
    //求最大公约数和最小公倍数
    private static void max_min(int m, int n){
        int temp = 1;
        int yshu = 1;
        int bshu = m*n;
        if(n<m){
            temp = n;
            n = m;
            m = temp;
        }
        while(m!=0){
            temp = n%m;
            n = m;
            m = temp;
        }
        yshu = n;
        bshu /= n;
        System.out.println(m+"和"+n+"的最大公约数为"+yshu);
        System.out.println(m+"和"+n+"的最小公倍数为"+bshu);
    }
}


7:

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

public class Test {

	public static void main(String[] args) {
		Check("sfs4564 4564fdg 4564gfd456 $%dgdf^%&%&");
		System.out.println("--------------------------");
		Check("sfs4564 4564fdg 4564gfd456 $%dgdf^%&%&");
	}

	// 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
	private static void Check(String s) {
		int enNum = 0;
		int nuNum = 0;
		int kongNum = 0;
		int othNum = 0;
		// 转换成字符数组遍历
		char[] chs = s.toCharArray();
		for (int i = 0; i < chs.length; i++) {
			// 如果是数字
			if (Character.isDigit(chs[i])) {
				nuNum++;
				// 是否字母
			} else if (Character.isLetter(chs[i])) {
				enNum++;
				// 是否空格
			} else if (chs[i] == ' ') {
				kongNum++;
			} else {
				// 其他字符
				othNum++;
			}
		}
		System.out.println("数字字符数量为:" + nuNum);
		System.out.println("字母字符数量为:" + enNum);
		System.out.println("空格字符数量为:" + kongNum);
		System.out.println("其他字符数量为:" + othNum);
	}
	
	//调用字符串charAt()方法遍历
	private static void Check2(String s) {
		int enNum = 0;
		int nuNum = 0;
		int kongNum = 0;
		int othNum = 0;
		for (int i = 0; i < s.length(); i++) {
			if (Character.isDigit(s.charAt(i))) {
				nuNum++;
			} else if (Character.isLetter(s.charAt(i))) {
				enNum++;
			} else if (s.charAt(i) == ' ') {
				kongNum++;
			} else {
				othNum++;
			}
		}
		System.out.println("数字字符数量为:" + nuNum);
		System.out.println("字母字符数量为:" + enNum);
		System.out.println("空格字符数量为:" + kongNum);
		System.out.println("其他字符数量为:" + othNum);
	}
}

输出:

数字字符数量为:15

字母字符数量为:13

空格字符数量为:3

其他字符数量为:7

--------------------------

数字字符数量为:15

字母字符数量为:13

空格字符数量为:3

其他字符数量为:7


Test2:

importjava.util.Scanner;
public classProg7_1{
    public static void main(String[] args){
        System.out.print("请输入一串字符:");
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();//将一行字符转化为字符串
        scan.close();
        count(str);
    }
    //统计输入的字符数
    private static void count(String str){
        String E1 ="[\u4e00-\u9fa5]";//汉字
        String E2 = "[a-zA-Z]";
        String E3 = "[0-9]";
        String E4 = "\\s";//空格
        int countChinese = 0;
        int countLetter = 0;
        int countNumber = 0;
        int countSpace = 0;
        int countOther = 0;
        char[] array_Char = str.toCharArray();//将字符串转化为字符数组
        String[] array_String = newString[array_Char.length];//汉字只能作为字符串处理
        for(int i=0;i<array_Char.length;i++)
         array_String[i] = String.valueOf(array_Char[i]);
        //遍历字符串数组中的元素
        for(String s:array_String){
            if(s.matches(E1))
             countChinese++;
            else if(s.matches(E2))
             countLetter++;
            else if(s.matches(E3))
             countNumber++;
            else if(s.matches(E4))
             countSpace++;
            else
             countOther++;
        }
        System.out.println("输入的汉字个数:"+countChinese);
        System.out.println("输入的字母个数:"+countLetter);
        System.out.println("输入的数字个数:"+countNumber);
        System.out.println("输入的空格个数:"+countSpace);
        System.out.println("输入的其它字符个数:"+countSpace);
    }
}
importjava.util.*;
public classProg7_2{
    public static void main(String[] args){
     System.out.println("请输入一行字符:");
     Scanner scan = new Scanner(System.in);
     String str = scan.nextLine();
     scan.close();
     count(str);
    }
    //统计输入的字符
    private static void count(String str){
        List<String> list = newArrayList<String>();
        char[] array_Char = str.toCharArray();
        for(char c:array_Char)
         list.add(String.valueOf(c));//将字符作为字符串添加到list表中
        Collections.sort(list);//排序
        for(String s:list){
            int begin = list.indexOf(s);
            int end = list.lastIndexOf(s);
            //索引结束统计字符数
            if(list.get(end)==s)
             System.out.println("字符‘"+s+"’有"+(end-begin+1)+"个");
        }
    }
}


8:

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

程序分析:关键是计算出每一项的值。

public class Test {

	public static void main(String[] args) {

		for (int i = 1; i < 10; i++) {
			System.out.println(Sum(2, i));
		}
	}

	/***
	 * 特殊求和方法 求s=a+aa+aaa+aaaa+aa...a的值
	 * 
	 * @param a
	 *            要做相加操作的数字
	 * @param count
	 *            相加的次数
	 * @return 总和
	 */
	private static int Sum(int a, int count) {
		// 求和变量
		int sum = 0;
		// 临时变量
		int temp = a;
		// 经历count次求和
		for (int i = 0; i < count; i++) {
			// 第一次的和即a的值
			sum += temp;
			// 之后的值每次更新为a上一次的值乘10再加上a
			temp = temp * 10 + a;
		}
		return sum;
	}	
}

Test2:

importjava.util.Scanner;
 
public classProg8{
    public static void main(String[] args){
        System.out.print("求s=a+aa+aaa+aaaa+...的值,请输入a的值:");
        Scanner scan = newScanner(System.in).useDelimiter("\\s*");//以空格作为分隔符
        int a = scan.nextInt();
        int n = scan.nextInt();
        scan.close();//关闭扫描器
        System.out.println(expressed(2,5)+add(2,5));
    } 
    //求和表达式
    private static String expressed(int a,intn){
        StringBuffer sb = new StringBuffer();
        StringBuffer subSB = new StringBuffer();
        for(int i=1;i<n+1;i++){
         subSB = subSB.append(a);
         sb = sb.append(subSB);
         if(i<n)
           sb = sb.append("+");
        }
        sb.append("=");
        return sb.toString();
    }
    //求和
    private static long add(int a,int n){
        long sum = 0;
        long subSUM = 0;
        for(int i=1;i<n+1;i++){
            subSUM = subSUM*10+a;
            sum = sum+subSUM;
        }
        return sum;
    }
}


9:

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。


Test:

public class CeShi {
	/**
	 * 题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		WanShu(1000);
	}

	/***
	 * 
	 * @param n
	 */
	private static void WanShu(int n) {
		int count = 0;
		// 从1到给定的数字n遍历
		for (int i = 1; i <= n; i++) {
			// 待用变量
			int temp = 0;
			// 内循环从1到n/2获取各个最小质数
			for (int j = 1; j <= n / 2; j++) {
				// 判断是否当前数字的质数
				if (i % j == 0) {
					// 如果是质数就累加
					temp += j;
					// 如果质数累加的结果和当前数字相同,则判定为完数并输出
					if (temp == i) {
						System.out.println(i);
						count++;
					}
				}
			}

		}
		System.out.println(n + "以内共有" + count + "个完数");
	}
}

输出:

1

6

24

28

496

1000以内共有5个完数


10:

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

Test:

public class CeShi {
	/**
	 * 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			GetHeight(i);
			System.out.println("------------------------------");
		}

	}

	private static void GetHeight(int count) {
		// 统计第count次弹起时经过的距离
		double sum = 0.0;
		// 统计第count次下落时经过的距离
		double sum2 = 0.0;
		// 原始高度
		double height = 100.0;

		for (int i = 1; i <= count; i++) {
			// 每次弹起时经过的距离为下落时高度的1.5倍
			sum += height + height / 2;
			// 当达到第count次时,弹起时的总距离减去最后一次弹起的高度即为第count次下落时经过的距离
			if (i == count) {
				sum2 = sum - height / 2;
				System.out.println("第" + count + "次时弹起的高度为:" + height / 2);
			}
			// 每弹起一次,起始下落高度减半
			height /= 2;

		}
		System.out.println("第" + count + "次落下时经过的距离是:" + sum2 + "米。");
		System.out.println("第" + count + "次弹起时经过的距离是:" + sum + "米。");
	}
}

输出:

第1次时弹起的高度为:50.0

第1次落下时经过的距离是:100.0米。

第1次弹起时经过的距离是:150.0米。

------------------------------

第2次时弹起的高度为:25.0

第2次落下时经过的距离是:200.0米。

第2次弹起时经过的距离是:225.0米。

------------------------------

第3次时弹起的高度为:12.5

第3次落下时经过的距离是:250.0米。

第3次弹起时经过的距离是:262.5米。

------------------------------

第4次时弹起的高度为:6.25

第4次落下时经过的距离是:275.0米。

第4次弹起时经过的距离是:281.25米。

------------------------------

第5次时弹起的高度为:3.125

第5次落下时经过的距离是:287.5米。

第5次弹起时经过的距离是:290.625米。

------------------------------

第6次时弹起的高度为:1.5625

第6次落下时经过的距离是:293.75米。

第6次弹起时经过的距离是:295.3125米。

------------------------------

第7次时弹起的高度为:0.78125

第7次落下时经过的距离是:296.875米。

第7次弹起时经过的距离是:297.65625米。

------------------------------

第8次时弹起的高度为:0.390625

第8次落下时经过的距离是:298.4375米。

第8次弹起时经过的距离是:298.828125米。

------------------------------

第9次时弹起的高度为:0.1953125

第9次落下时经过的距离是:299.21875米。

第9次弹起时经过的距离是:299.4140625米。

------------------------------

第10次时弹起的高度为:0.09765625

第10次落下时经过的距离是:299.609375米。

第10次弹起时经过的距离是:299.70703125米。

------------------------------


Test2:

importjava.util.Scanner;
public classProg10{
    public static void main(String[] args){
        System.out.print("请输入小球落地时的高度和求解的次数:");
        Scanner scan = newScanner(System.in).useDelimiter("\\s");
        int h = scan.nextInt();
        int n = scan.nextInt();
        scan.close();
        distance(h,n);
    }
    //小球从h高度落下,经n次反弹后经过的距离和反弹的高度
    private static void distance(int h,int n){
        double length = 0;
        for(int i=0;i<n;i++){
            length += h;
            h /=2.0 ;
        }
        System.out.println("经过第"+n+"次反弹后,小球共经过"+length+"米,"+"第"+n+"次反弹高度为"+h+"米");
    }
}

你可能感兴趣的:(java)