【原】Java学习笔记009 - 阶段测试
package cn.temptation; public class Sample01 {
public static void main(String[] args) {
// 1、需求:打印如下图形
/*
* * *
* * *
* * *
* * *
* *
* * *
* * *
* * *
* * *
*/ // 打印上部
for (int i = 0; i < 5; i++) {
// 打印空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
} // 打印星号
System.out.print("*"); // 打印空格
for (int j = 0; j < 7 - i * 2; j++) {
System.out.print(" ");
} // 打印星号
if (i != 4) { // 第5行时不打印后面的星号
System.out.print("*");
} // 换行
System.out.println();
} // 打印下部
for (int i = 0; i < 4; i++) {
// 打印空格
for (int j = 0; j < 3 - i; j++) {
System.out.print(" ");
} // 打印星号
System.out.print("*"); // 打印空格
for (int j = 0; j < i * 2 + 1; j++) {
System.out.print(" ");
} // 打印星号
System.out.print("*"); // 换行
System.out.println();
}
}
}
package cn.temptation; public class Sample02 {
public static void main(String[] args) {
// 2、需求:猴子第一天早上摘下若干个桃子,当即吃了一半,觉得不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
// 以后每天早上都多吃了前一天的一半零一个。到第10天早上再吃时,发现就剩下一个桃子了。求第一天共摘了多少个桃子。 // 思路:正向思维比较复杂时,可以考虑逆向思维,把第10天看成逆向的第1天,第9天看成逆向的第2天,... int count = 1; for (int i = 2; i <= 10; i++) {
count = (count + 1) * 2;
} System.out.println("第一天共摘了" + count + "个桃子");
}
}
package cn.temptation; public class Sample03 {
public static void main(String[] args) {
// 3、需求:商店里篮球原价为78元一个,现在为了促销,推出了买5个送1个的活动,波波维奇需要35个球,问他需要花多少钱? // 单价
int price = 78;
// 购买的篮球数
int number = 1;
// 赠送的篮球数
int extendNumber = 0;
// 需求的篮球数
int totalNumber = 35; for(;;) {
// 买5个送1个,赠送的数量加在赠送的篮球数的变量上
if (number % 5 == 0) {
extendNumber++;
} // 购买的篮球数量 + 赠送的篮球数量 达到 需要的篮球数量,就跳出这个死循环
if (number + extendNumber >= totalNumber) {
break;
} number++;
} System.out.println("波波维奇需要35个球,问他需要花" + (number * price) + "元");
}
}
package cn.temptation; public class Sample04 {
public static void main(String[] args) {
// 4、需求:网红开网店,工作日营业,休息日出去玩。工作日每天随机得到150~200元,休息日每天随机花费100~150元,问需要经过多少天,她才能存到5201314元
// (假设她是从某一个周一开始计算)
// 提示:随机数使用Math.random()方法 // 思路:
// 最终存下来的钱 = 赚的钱 - 花的钱
// (工作日) (休息日) // 1、研究随机数的产生
// Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
// 常用的成员方法:
// static double random() :返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
// System.out.println(Math.random());
// 150 ~ 200 -----> 150 + 0 ~ 150 + 50 -----> 150 + Math.random() * 50
// 100 ~ 150 -----> 100 + 0 ~ 100 + 50 -----> 100 + Math.random() * 50
// System.out.println((int)(150 + Math.random() * 50));
// System.out.println((int)(100 + Math.random() * 50)); // 2、根据赚钱 和 花钱 的规则,明显要使用选择结构 // 3、研究工作日 和 休息日的判定
// 可以类比使用 %10 获取个位数字(因为那是十进制),这里一周七天(理解为七进制),所以可以通过 %7 获取是星期几 // 定义天数
int day = 1;
// 定义存的钱数
int totalMoney = 0; for(;;) {
// 随机賺的钱
int earnMoney = (int)(150 + Math.random() * 50);
// 随机花的钱
int payMoney = (int)(100 + Math.random() * 50); // 工作日 和 休息日 的业务逻辑
switch (day % 7) {
case 1:
case 2:
case 3:
case 4:
case 5:
// 工作日
totalMoney += earnMoney;
break;
case 6:
case 0:
totalMoney -= payMoney;
break;
default:
System.out.println("输入错误");
break;
} // 跳出死循环的条件
if (totalMoney >= 5201314) {
break;
} // 用时的天数需要自增
day++;
} System.out.println("需要经过" + day + "天,她才能存到5201314元");
}
}
package cn.temptation; import java.util.Scanner; public class Sample05 {
public static void main(String[] args) {
// 5、需求:输入两个正整数,求其最大公约数 和 最小公倍数 // 思路:
// 最大公约数
// 1、对输入的两个正整数进行大小比较
// 2、用比较大的数除以比较小的数,如果两个数一样大,那么最大公约数就是其本身;
// 如果较大的数正好可以整除较小的数,那么最大公约数就是较小的数;
// 如果较大的数不能整除较小的数,将得到的余数作为新的较小的数,刚才的较小的数作为较大的数再去做除法,直到得到的余数为0为止 // 最小公倍数:两个数的乘积除以最大公约数 Scanner input = new Scanner(System.in);
System.out.println("输入第一个数:");
int i = input.nextInt();
System.out.println("输入第二个数:");
int j = input.nextInt();
input.close(); // 声明最大公约数
int gcd = 0; // 获取两个数的乘积(为了后续求最小公倍数时使用,否则后续这两个数字在循环中会发生改变)
int result = i * j; // 求最大公约数
// 1、对输入的两个正整数进行大小比较
if (i < j) {
int temp = i;
i = j;
j = temp;
} // 2、用比较大的数除以比较小的数,如果两个数一样大,那么最大公约数就是其本身;
// 如果较大的数正好可以整除较小的数,那么最大公约数就是较小的数;
// 如果较大的数不能整除较小的数,将得到的余数作为新的较小的数,刚才的较小的数作为较大的数再去做除法,直到得到的余数为0为止
// 注意:数学算式上 被除数 % 除数 = 商......余数 while (j != 0) {
if (i == j) {
gcd = i = j;
} else {
// 对于当次循环操作,被除数 % 除数
gcd = i % j;
// 下面两句实际上是为下次循环的操作来做准备的,即这次循环中的除数移到被除数的位置、余数移到除数的位置
i = j;
j = gcd;
}
} // 循环结束时,就是余数为0时,最大公约数不是放在gcd这个变量中的,而是在i这个变量中
gcd = i;
System.out.println("最大公约数为:" + gcd); System.out.println("最小公倍数为:" + result / gcd);
}
}
package cn.temptation; import java.util.Scanner; public class Sample06 {
public static void main(String[] args) {
// 6、需求:编写程序,实现Fibonacci数列的求解
// 提示:Fibonacci数列 1、1、2、3、5、8、13、21、... // 思路:分析规律
// Fibonacci数列:第1项 和 第2项均为1;从第3项开始,值等于前面两项的和 // 写法1、常规写法(使用循环)
// 第3项 = 第2项 + 第1项
// 第4项 = 第3项 + 第2项 = (第2项 + 第1项) + 第2项
// 第5项 = 第4项 + 第3项 = ((第2项 + 第1项) + 第2项) + (第2项 + 第1项) // 写法2、使用递归
// 递归:方法调用自身的写法称为递归
// 从数学角度归纳公式
// F(1) = 1
// F(2) = 1
// F(n) = F(n - 1) + F(n - 2) (n > 2) // F(n) = F(n - 1) + F(n - 2) -----> F(n - 1) = F(n - 1 - 1) + F(n - 1 - 2), F(n - 2) = F(n - 2 - 1) + F(n - 2 - 2)
// ....... -----> F(3) = F(2) + F(1) = 1 + 1 // 逆向思考一下
// 位置 第一个位置 第二个位置
// F(3) F(2) + F(1)
// F(4) F(3) + F(2) Scanner input = new Scanner(System.in);
System.out.println("输入项数:");
int n = input.nextInt();
input.close(); System.out.println("该项的值为:" + Fibonacci(n)); // printFibonacci(n); System.out.println("该项的值为:" + FibonacciEx(n));
} /**
* 写法1、常规写法(使用循环)
* 获取Fibonacci数列指定项的值
* @param n:指定项数
* @return:Fibonacci数列指定项对应的值
*/
public static int Fibonacci(int n) {
// 第1项
int i = 1;
// 第2项
int j = 1;
// 定义当次结果
int tempResult = 0;
// 定义最终结果
int result = 0; if (n <= 2 && n > 0) {
result = i = j = 1;
} else {
// 使用循环来实现
for (int k = 3; k <= n; k++) {
// 计算出当次结果
tempResult = i + j;
// 为了给下一次循环使用,调整一下i位置上 和 j位置上的值
j = i;
i = tempResult;
} result = tempResult;
} return result;
} /**
* 写法1、常规写法(使用循环)
* 打印Fibonacci数列的指定项之前所有的值
* @param n
*/
public static void printFibonacci(int n) {
// 第1项
int i = 1;
// 第2项
int j = 1;
// 定义当次结果
int tempResult = 0; // 使用循环来实现
for (int k = 1; k <= n; k++) {
if (k <= 2 && k > 0) {
tempResult = i = j = 1;
System.out.print(tempResult + "\t");
} else {
// 计算出当次结果
tempResult = i + j;
System.out.print(tempResult + "\t");
// 为了给下一次循环使用,调整一下i位置上 和 j位置上的值
j = i;
i = tempResult;
}
}
} /**
* 写法2、创建递归方法
* @param n
* @return
*/
public static int FibonacciEx(int n) {
// 声明最终结果
int result = 0; if (n <= 2 && n > 0) {
result = 1;
} else {
result = FibonacciEx(n - 1) + FibonacciEx(n - 2);
} return result;
}
}
【原】Java学习笔记009 - 阶段测试的更多相关文章
- 【原】Java学习笔记013 - 阶段测试
package cn.temptation; import java.util.Scanner; public class Sample01 { public static void main(Str ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 0035 Java学习笔记-注解
什么是注解 注解可以看作类的第6大要素(成员变量.构造器.方法.代码块.内部类) 注解有点像修饰符,可以修饰一些程序要素:类.接口.变量.方法.局部变量等等 注解要和对应的配套工具(APT:Annot ...
- 0032 Java学习笔记-类加载机制-初步
JVM虚拟机 Java虚拟机有自己完善的硬件架构(处理器.堆栈.寄存器等)和指令系统 Java虚拟机是一种能运行Java bytecode的虚拟机 JVM并非专属于Java语言,只要生成的编译文件能匹 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- 20145330第十周《Java学习笔记》
20145330第十周<Java学习笔记> 网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就 ...
- 20145330第九周《Java学习笔记》
20145330第九周<Java学习笔记> 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JD ...
- Java学习笔记——动态代理
所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...
随机推荐
- 【Scala篇】--Scala中Trait、模式匹配、样例类、Actor模型
一.前述 Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大. 模式匹配机制相当于java中的switch-case. 使用了case关键字的类定义就是样例类(case ...
- Python内置函数(8)——bytes
英文文档: class bytes([source[, encoding[, errors]]]) Return a new “bytes” object, which is an immutable ...
- 7.Django CSRF 中间件
CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...
- java多线程(3)---synchronized、Lock
synchronized.Lock 一.概述 1.出现线程不安全的原因是什么? 如果我们创建的多个线程,存在着共享数据,那么就有可能出现线程的安全问题:当其中一个线程操作共享数据时,还未操作完成,另外 ...
- C# int数据类型呵呵
int16=short; int32=int; int64=long; Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数. Int32 值类型表示值介于 -2,147,4 ...
- leetcode — candy
/** * Source : https://oj.leetcode.com/problems/candy/ * * There are N children standing in a line. ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- PE知识复习之PE的导入表
PE知识复习之PE的导入表 一丶简介 上一讲讲解了导出表. 也就是一个PE文件给别人使用的时候.导出的函数 函数的地址 函数名称 序号 等等. 一个进程是一组PE文件构成的. PE文件需要依赖那些 ...
- [二十五]JavaIO之RandomAccessFile
功能简介 我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此 但是 RandomAccessFile自成一派 此类的实例支持对随机访问文件的读取和写入 我们之前介绍过DataOutpu ...
- 【Node.js】通过mongoose得到模型,不能新添字段的问题
问题描述 通过node.js为查询到的json对象添加新的字段,对象成功保存到数据库中,但新增字段却没保存. 前几天用vue+node.js+mongodb技术做一个购物车功能的网页,发现node.j ...