计算机的一些基本常识
数据单位
在计算中表示数据的最小单位是比特 - bit - 一个0或者一个1
- 字节(Byte) = 8比特(bit)
- 千字节(KB) = 1024B
- 兆字节(MB) = 1024KB
- 吉字节(GB) = 1024MB
- 太字节(TB) = 1024GB
// 100Mbps ---> 12.5MBps
// 1km ---> 1000m ---> 10^3
// 1KB ---> 1024B ---> 2^10
关于二进制的拓展
// 123 = 1 * 10^2 + 2 * 10 ^ 1 + 3 * 10 ^ 0
// 一个字节
// 00000000
// 00000001
// 内存中的-2
// 10000010 - 原码
// 11111101 - 反码
// 11111110 - 补码
// 内存中的127
// 01111111 = 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 2^7 - 1
// 01111111 11111111 = 2^15 - 1
// 01111111 11111111 11111111 11111111 = 2^31 - 1
01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 = 2^63 - 1
变量和常量
// 关键字 - 在程序中有特殊含义的单词 - keyword
// 表示类型的关键字:
// - byte(1) / short(2) / int(4) / long(8)
// - float(4) / double(8)
// - char(2)
// - boolean(1bit) true(真) / false(假)
// 标识符 - 给变量、常量、方法、类、接口等起的名字就叫标识符 - identifier
// 标识符命名规则 :
// 1. 字母(Unicode字符)、数字、下划线和$, 数字不能开头
// 2. 大小写敏感(区分大小写)
// 3. 不能使用关键字作标识符
// 4. 见名知意
// 5. 驼峰命名法
// - 命名类、接口、枚举、注解:每个单词首字母大写
// - 命名变量、方法:第一个单词全小写从第二个单词开始每个单词首字母大写
// - 命名常量用全大写,多个单词用下划线分隔
// 运算符 - operator
// - 赋值运算符 =、+=、-=、*=、/=、%=、……
// - 算术运算符 +、-、*、/、%
// - 比较运算符 >、<、>=、<=、==、!= - 结果一定是布尔值
// - 逻辑运算符 &(逻辑与运算)、|(逻辑或运算)
// - 短路运算符 &&(短路与运算-而且)、||(短路或运算-或者)
// 字面量(直接量) - literal
// - 整数字面量: 123 0x123 0123 0b101 10L
// - 小数字面量: 1.23F 1.23 1.23e2 1.23e-2
// - 字符字面量: 'a' 'A' '昊' '\n' '\'' '\123'
// - 布尔字面量: true false
// - 字符串字面量: "hello"
// - 引用字面量: null
// - 类型字面量: String.class int.class
// 分隔符 - separator
// - ; , { } ( ) [ ] : 空格
基础的程序
System.out.println(int.class);
System.out.println(String.class);
int x =3, y = 5, z = 3;
// System.out.println(x > y); // false
// System.out.println(x != y); // true
// System.out.println(x == y); // false
// System.out.println(x >= z); // true
System.out.println(x > y && y > z); // false
System.out.println(x > y || y > z); // true
// final int CAPACITY_OF_ROOM = 120;
// int ageOfStudent;
// double A = 100.1;
int a = 10;
a += 20; // a = a + 20;
a *= 5; // a = a * 5;
a *= a + 2; // a = a * (a + 2);
System.out.println(a);
// int 1a = 1000;
// int public = 12;
// double static = 3.5;
int a1 = 101; // 十进制
int a2 = 0101; // 八进制
int a3 = 0x101; // 十六进制
int a4 = 0b101; // 二进制 Java 7+
long a5 = 12345678L; // 长整数
int a6 = 12_345_678; // Java 7+
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
System.out.println(a5);
System.out.println(a6);
float b1 = 1.23F; // 单倍精度浮点数
double b2 = 1.23; // 双倍精度浮点数
double b3 = 123.456;
// 科学计数法
double b4 = 1.23456e2;
double b5 = 1.23456e-2;
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
System.out.println(Byte.MIN_VALUE + "~" + Byte.MAX_VALUE);
System.out.println(Short.MIN_VALUE + "~" + Short.MAX_VALUE);
System.out.println(Integer.MIN_VALUE + "~" + Integer.MAX_VALUE);
System.out.println(Long.MIN_VALUE + "~" + Long.MAX_VALUE);
System.out.println(Float.MIN_VALUE + "~" + Float.MAX_VALUE);
System.out.println(Double.MIN_VALUE + "~" + Double.MAX_VALUE);
char $x = 'A';
char $y = '昊';
// String name = "王大锤";
System.out.println($x);
System.out.println((int) $x);
System.out.println($y);
System.out.println((int) $y);
System.out.println((char) 26115);
boolean z0 = true;
boolean z1 = false;
System.out.println(z0);
System.out.println(z1);
}
}
练习
- 个人所得税算法
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.println("请输入你的五险一金");
double insurance = input.nextDouble();
System.out.println("请输入你的工资");
double salary = input.nextDouble();
double t = salary - 3500 - insurance;
double x =0;
double z = 0;
if (t < 0) {
System.out.println("你不需要缴纳个人所得税");
} else if (t <= 1500) {
z = 0.03;
x = 0;
} else if (t <= 4500) {
z = 0.1;
x = 105;
} else if (t <= 9000) {
z = 0.2;
x = 555;
} else if (t <= 35000) {
z = 0.25;
x = 1005;
} else if (t <= 55000) {
z = 0.3;
x = 2755;
} else if (t <= 80000) {
z = 0.35;
x = 5505;
} else {
z = 0.45;
x = 13505;
}
double tax = t * z - x;
System.out.printf("你需要缴纳的个人所得税为:%.2f元\n" , tax);
System.out.printf("本月实发工资为:%.2f元\n",(salary-tax-insurance));
input.close();
}
- 输入x年x月,判断这个月有多少天
import java.util.Scanner;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个月份");
if (input.hasNextInt()) {
int month = input.nextInt();
if (month == 1 || month == 3 || month == 5 || month == 7 ||
month == 8 || month == 10 || month == 12) {
System.out.println("这个月有" + 31 + "天");
}
else if (month == 4 || month == 6 || month == 9 || month == 11) {
System.out.println("这个月有" + 30 + "天");
}
if (month == 2) {
System.out.println("请输入一个年份");
int year =input.nextInt();
if ((year % 4 == 0 && year % 100 != 0)
|| year % 400 == 0) {
System.out.println("这个月有" + 29 + "天");
}
else {
System.out.println("这个月有" + 28 + "天");
}
}
} else {
System.out.println("这里需要一个整数!!");
}
// System.out.println("请输入一个年份");
input.close();
}
- 三角形成立的条件和周长面积
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入三条边长");
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
boolean isvalid = (a + b) > c && (a + c) > b && (b + c) > a;
if (a > 0 && b > 0 && c > 0 && isvalid) {
double p = a + b + c;
double S = Math.sqrt(p / 2 * (p / 2 - a) * (p / 2 - b) * (p / 2 - c));
System.out.printf("三角形的周长是:%.2f\n", p);
System.out.printf("三角形的面积是:%.2f\n", S);
} else {
System.out.println("不能构成三角形!");
}
input.close();
}
4.分段函数
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入x=");
double x = input.nextDouble();
double y;
if (x < -1) {
y = 3 * x + 5;
} else if (x <= 1) {
y = x - 1;
} else {
y = 5 * x - 3;
}
System.out.println("y =" + y);
input.close();
}
5.润年的判断
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// int a = input.nextInt();
// int b = input.nextInt();
// System.out.println(a>b?a:b);
System.out.println("请输入一个年份");
//分支结构(选择结构) - 可以让程序有多条执行路径
if (input.hasNextInt()){
int year = input.nextInt();
boolean isLeapYear = (year % 4 == 0 && year % 100 != 0)
|| year % 400 == 0;
System.out.println(year + "年" +
(isLeapYear ? "是" : "不是") + "润年");
input.close();
}
else {
System.out.println("瓜兮兮的,这里需要一个整数!!");
}
// 注释:上题是判断是否是润年。
}
6.Graps赌博游戏
游戏规则:
//-两颗筛子
//-第一次:
//玩家摇出 7或 11 玩家胜
// 2 3 或 12 庄家胜
// 其他点数 游戏继续
//玩家再摇
// 如果摇出了7点 庄家胜
// 如果摇出了第一次的点数 玩家胜
// 其他情况 游戏继续
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请按Enter开始游戏");
String x = input.nextLine();
int a =(int) (Math.random()*6+1);
int b =(int) (Math.random()*6+1);
int num = a + b;
int n = 1;
System.out.println("第1次你摇出了" + a + "和" + b );
System.out.println("总计" + num + "点");
if (num == 7 || num == 11){
System.out.println("第1局玩家获胜");
}
else if (num == 2 || num == 3 || num == 12) {
System.out.println("第1局庄家获胜");
}
else {
while(true){
System.out.println("现在平局,请按Enter继续");
String y = input.nextLine();
int c =(int) (Math.random()*6+1);
int d =(int) (Math.random()*6+1);
int newnum = c + d;
n+=1;
System.out.println("第" + n + "次你摇出了" + c + "和" + d );
System.out.println("总计" + newnum + "点");
if (newnum == 7){
System.out.println("庄家获胜");
break;
}
else if (newnum == num) {
System.out.println("和第一轮总和相同,玩家获胜");
break;
}
}
}
input.close();
}
7.捕鱼问题:
n个人,第1个人先将鱼扔掉一只然后平分五份拿走其中一份,第2个人也将鱼扔掉一只然后平分五份拿走其中一份,以此类推,直到第n个人的时候也扔掉一只然后平分五份拿走其中一份,求这堆鱼至少有多少只。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入捕鱼的人数");
int n = input.nextInt();
for (int a = 1; a <= Integer.MAX_VALUE; a++) {
int i = 1;
int b = a;
boolean x = true;
while (i <= n && x) {
if (b % n == 1) {
b = (n - 1) * (b - 1) / n;
i++;
x = true;
} else {
i++;
x = false;
}
}
if (x && i==(n+1)) {
System.out.print(a);
break;
}
}
input.close();
}