CRRE JAVA 第一章部分习题

1.写个程序,读取一个整数并以二进制,八进制和十六进制输出,以十六进制浮点数输出倒数。

代码

package PART1;
import java.util.Scanner;
/*
写个程序,读取一个整数并以二进制,八进制和十六进制输出,以十六进制浮点数输出倒数。
*/

public class p1_1{
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.print("请输入一个整数:");
		Integer a = in.nextInt();
		System.out.println("二进制:"+Integer.toString(a,2));
		System.out.println("八进制:0"+Integer.toString(a,8));
		System.out.println("十六进制:0x"+Integer.toString(a,16));
		double b = 1.0/a;
		System.out.printf("%A",b);
	}
}

输出

请输入一个整数:524
二进制:1000001100
八进制:01014
十六进制:0x20c
浮点数:0X1.F44659E4A4271P-10

总结

  1. 输入:
    • 用Scanner类,需导入java.util.Scanner;
  2. Interger类:
    • public static String toString(int i, int radix)
      将 int 转换为 String,以 radix 为进制。
  3. 输出:
    • System.out.println();
    • System.out.printf();
      使用方法同C语言;
  4. 进制:
    • 二进制输出无占位符;
    • 八进制,以0开头,占位符:%o;
    • 十六进制,以0x开头,占位符:%x;
    • %a,%A:读入一个浮点值。

2.写个程序,它读取整数,然后经过模运算转换为 0° ~ 359° 之间的值。首先以操作符 % 完成,然后再试 floorMod。

代码

package PART1;
import java.util.Scanner;
/*
 写个程序,它读取整数,然后经过模运算转换为 0° ~ 359° 之间的值。首先以操作符 % 完成,然后再试 floorMod。
 */
public class p1_2 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("输入一个整数:");
		int a = scanner.nextInt();
		System.out.println("取余%:"+a%360);
		System.out.println("floorMod:"+Math.floorMod(a,360));
	}
}

输出

输入一个整数:-654
取余%:-294
floorMod:66

输入一个整数:524
取余%:164
floorMod:164

总结

%与floorMod的区别

在matlab中,关于取余和取模是这么定义的:
当y≠0时:
取余:rem(x,y)=x-y.fix(x./y)
取模:mod(x,y)=x-y.
floor(x./y)
其中,fix()函数是向0取整,floor()函数是向负无穷取整

eg:
5 / (-3) 约等于-1.7
在取余运算时候商值向0方向舍弃小数位于是fix(-1.7) =  -1
取余结果 : 5 - (-3)(-1) = 2
在取模运算时商值向负无穷方向舍弃小数位于是 floor(-1.7) = -2
取模结果 : 5 - (-3)(-2) = -1

符号对照表

x y x%y Math.floorMod(x,y)
- + - +
+ - + -
- - - -
+ + + +
  • 取余:结果符号和被除数一致;
  • 取模:结果符号和除数一致。

3.只用条件操作符,写一个程序,读取三个整数并输出最大的。使用 Math.max 实现同样的功能。

代码

package PART1;
import java.util.Scanner;
public class p1_3 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int a,b,c;
		int max1,max2;
		System.out.print("请输入第一个整数:");
		a=scanner.nextInt();
	    System.out.print("请输入第二个整数:");
	    b=scanner.nextInt();
		System.out.print("请输入第三个整数:");
		c=scanner.nextInt();
		//条件操作符
		max1=a>b?a:b;
		max1=max1>c?max1:c;
		System.out.println("经条件运算符运算,三者中最大的数为:"+max1);
		//Math.max
		max2=Math.max(a, b);
		max2=Math.max(max2, c);
		System.out.println("经Math.max运算,三者中最大的数为:"+max2);
	}
}

输出

请输入第一个整数:35
请输入第二个整数:5463
请输入第三个整数:435
经条件运算符运算,三者中最大的数为:5463
经Math.max运算,三者中最大的数为:5463

总结

  • 条件运算符:
    关系表达式 ? 表达式1 : 表达式2
  • Math.max方法还可写成
Math.max(Math.max(a, b), c);

6.写个程序,计算阶乘 n! = 1 × 2 × ... × n,使用 BigInteger。计算 1000 的阶乘。

代码

package PART1;
import java.math.BigInteger;
public class p1_6 {
	private static BigInteger Nstage(int n) {
		BigInteger result = new BigInteger("1");
        for (int i = 1; i <= n; i++) {
            BigInteger num = new BigInteger(String.valueOf(i));
            result = result.multiply(num);// 调用自乘方法
        }
        return result;
	}
	public static void main(String[] args) {
		System.out.println("1000的阶乘:"+Nstage(1000));
	}
}

输出

1000的阶乘:402387260077093773543702433923003985……

总结

  • none

8.写个程序,读取一个字符串并输出该字符串所有的非空子字符串。

代码

package PART1;
public class p1_8 {
	public static void main(String[] args) {
		String str = "I AM YOUR FATHER ";
		String[] s = str.split("\\s");
		for(String string:s) {
			System.out.println(string);
		}
		System.out.println(s.length);
	}
}

输出

I
AM
YOUR
FATHER
4

总结

  • public String[] split(String regex,int limit)
    1. 第一个参数:分隔符,可以是正则表达式。
      //正则表达式还没看到 CORE JAVA CHAPTER 9
    2. 第二个参数:控制切割次数
      1.limit>0,切割 limit-1 次,数组长度不会大于切割次数。
      2.limit<0,将切割尽可能多的次数,而且数组的长度是任何长度。
      3.lilmit=0,将切割尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
      limit若不写,默认为0.

13.写个程序,可以输出一组彩票组合,该组合由 1~49 之间的 6 个不同数字组成。为产生 6 个不同数字,先用 1~ 49 填充一个数组。然后随机选择一个索引并删除对应元素,重复 6 次,并输出排序后的结果。

代码

package PART1;
/*写个程序,可以输出一组彩票组合,该组合由 1~49 之间的 6 个不同数字组成。
 * 为产生 6 个不同数字,先用 1~ 49 填充一个数组。
 * 然后随机选择一个索引并删除对应元素,重复 6 次,并输出排序后的结果。
 */

import java.util.Random;
public class p1_13 {
	public static void main(String[] args) {
		int[] a =new int[60];
		for(int i=0;i<60;i++) {
			a[i]=i+1;
		}
		Random random = new Random();
		int[] b = new int[6];
		for(int j = 49;j>43;j--) {
			int randomInt = random.nextInt(j);
			System.out.println("选中的随机数是:"+randomInt);
			b[49-j]=a[randomInt];
			
			for(int k=randomInt;k<=j;k++) {
				a[k]=a[k+1];
			}
			
		}
		System.out.println("选中的六个数:");
		for(int x=0;x<6;x++)
		System.out.println(b[x]);
		int temp;
		for(int i = 1;i<b.length;i++) {
			for(int j=0;j<b.length-i;j++) {
				if(b[j]>b[j+1]) {
					temp=b[j];
					b[j]=b[j+1];
					b[j+1]=temp;
				}
			}
		}
		System.out.println("排序后的六个数:");
		for(int x=0;x<6;x++)
			System.out.println(b[x]);
	}
	
}

输出

选中的随机数是:33
选中的随机数是:22
选中的随机数是:17
选中的随机数是:30
选中的随机数是:2
选中的随机数是:12
选中的六个数:
34
23
18
33
3
14
排序后的六个数:
3
14
18
23
33
34

总结

  • 数组初始化
    1. 静态初始化:自己确定每个数组元素的初始值,而数组的长度则由系统自己决定。
      int[] a = {1,2,3,4,5};
    2. 动态初始化:初始化时由自己确定数组的长度,而每一个数组元素的值,则由系统来分配初始值。
      int[] b=new int[5];
  • 随机数:Random
    1. import java.util.Random;
    2. 两种构造方法
      1.Random():创建一个新的随机数生成器。
      2.Random(long seed):使用单个 long 种子创建一个新的随机数生成器。
      3.方法
      1.protected int next(int bits)://生成下一个伪随机数。
      2.boolean nextBoolean()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
      3.void nextBytes(byte[] bytes)://生成随机字节并将其置于用户提供的 byte 数组中。
      4.double nextDouble()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的 double值。
      5.float nextFloat()://返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值。
      6.double nextGaussian()://返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的double值,其平均值是0.0标准差是1.0。
      7.int nextInt()://返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。
      8.int nextInt(int n)://返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值。
      9.long nextLong()://返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。
      10.void setSeed(long seed)://使用单个 long 种子设置此随机数生成器的种子。
      4.算法
      1.删除元素用到链表中顺序表删除元素的方法;
      2.排序:冒泡排序。
posted @ 2020-03-29 11:07  c1utchfan  阅读(243)  评论(0)    收藏  举报