【Java】分支结构
文章目录
- 【Java】分支结构
- 题1 :数字9 出现的次数
- 题2 :计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
- 题3 :猜数字
- 题4 :牛客BC110 X图案
- 题5 :输出一个整数的每一位
- 题6 : 模拟三次密码输入
- 题7:求整数的最大公约数
- 题8 :获取一个二进制序列中的所有偶数位和奇数位,分别输出二进制序列
这篇博客主要讲解几道我认为比较有代表性关于分支结构的编程题。
下面让我们开始吧!
题1 :数字9 出现的次数
/**
* 数字9 出现的次数
* 编写程序数一下 1到 100 的所有整数中出现多少个数字9
*/
public static void main(String[] args) {
int count = 0;
for (int i = 1; i <= 100; i++) {
if(i % 10 == 9){
count++;
}
if(i / 10 == 9){
count++;
}
}
System.out.println(count);
}
这道题主要就是要明确个位的9怎么判断,十位的9怎么判断,另外99是两个9.
题2 :计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
/**
* 计算分数的值
* 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值。
*/
public static void main(String[] args) {
double sum = 0;
int flag = 1;
for (int i = 1; i <= 100; i++) {
sum += 1.0 / i * flag;
flag = -flag;
}
System.out.println(sum);
}
这道题主要是观察题目的规律,定义一个flag
来实现正负的循环。
题3 :猜数字
/**
* 实现猜数字游戏
* 完成猜数字游戏 ,用户输入数字,判断该数字是大于,小于,还是等于随机生成的数字,等于的时候退出程序。
*/
public static void main(String[] args) {
Random random = new Random();
Scanner sc = new Scanner(System.in);
int guess = random.nextInt(100);
while(true){
System.out.println("请输入0-100的数字:>");
int num = sc.nextInt();
if(num < guess){
System.out.println("猜小了");
}else if(num > guess){
System.out.println("猜大了");
}else {
System.out.println("猜对了!");
break;
}
}
sc.close();
}
这道题前提是需要了解random
的使用,其次的条件判断语句按正常逻辑编写即可。见以下文章:
Java生成随机数
题4 :牛客BC110 X图案
X形图案
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。
输入描述:
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:
针对每行输入,输出用“*”组成的X形图案。
输入:
5
输出:
* *
* *
*
* *
* *
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j || i + j == n - 1) {
System.out.print("*");
}else {
System.out.print(" ");
}
}
System.out.print("\n");
}
break;
}
}
这道题我们可以知道X
是一个对称图形,所以X形图案可以拆分成两根斜线,其中i == j 时输出星号,或者i==n-i-1时输出星号即可,其他情况皆输出空格。
重点就在于i == j || i + j == n - 1
这段。
题5 :输出一个整数的每一位
/**
* 输出一个整数的每一位
* 输出一个整数的每一位,如:123的每一位是3,2,1
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
while(num != 0){
System.out.println(num%10);
num/=10;
}
}
题6 : 模拟三次密码输入
/**
* 编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,
* 密码错误, 可以重新输 入,最多输入三次。三次均错,则提示退出程序
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 3;
while (count != 0){
System.out.println("请输入您的密码:>");
String password = sc.nextLine();
if(password.equals("123")){
System.out.println("登陆成功!");
break;
}else {
count--;
System.out.println("请重新输入密码:> 还有"+count+"次机会");
}
}
}
这道题逻辑其实很明确,我更想聊一聊的是String
中==
与equals
的区别
- ==:
在比较对象时比较的是引用地址是否相同;
在比较基本类型时比较的是其内容。 - equals:
比较的是内容,而不比较其引用。
见以下示例代码:
String s1 = new String("aaa");
String s2 = new String("aaa");
// s1与s2不是同一个对象
System.out.println(s1==s2); //false
System.out.println(s1.equals(s2)); //true
String s1 = new String("aaa");
String s2 = s1;
//s1和s2是同一个地址的引用
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
String s1 = "aaa";
String s2 = "aaa";
// s1与s2是类似类型
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //true
针对第三示例代码,有以下想说的:
-
直接等号赋值是放入内存池的,其它变量也可以引用;
-
new初始化分配内存空间,不可引用。
String s=”a”
和String s=new String(“a”)
是有本质上的区别的。前者是在字符串池里写入一个字符
’a’
,然后用s指向它;后者是在堆上创建一个内容为
”a”
的字符串对象。
如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
题7:求整数的最大公约数
/**
* 求2个整数的最大公约数
* 给定两个数,求这两个数的最大公约数
* 例如:
* 输入:20 40
*
* 输出:20
这里要介绍一种算法:辗转相除法
辗转相除法(也称为欧几里得算法)是一种用于求解两个整数的最大公约数的算法。它的步骤如下:
- 将两个整数 a 和 b 作为输入。
- 计算 a 除以 b 的余数,将结果保存为 r。
- 如果 r 等于 0,则 b 即为最大公约数,算法结束。
- 如果 r 不等于 0,则令 a 等于 b,b 等于 r,然后返回第2步。
这个过程会一直重复,直到余数为0。最后的 b 就是输入整数 a 和 b 的最大公约数。
public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入两个数字:>");
int a = sc1.nextInt();
int b = sc2.nextInt();
int c = a % b;
while(c != 0){
a = b;
b = c;
c =a % b ;
}
System.out.println(b);
}
题8 :获取一个二进制序列中的所有偶数位和奇数位,分别输出二进制序列
-
提取所有的奇数位,如果该位是1,输出1,是0则输出0
-
以同样的方式提取偶数位置
检测num中某一位是0还是1的方式:
-
将num向右移动i位
-
将移完位之后的结果与1按位与,如果:
结果是0,则第i个比特位是0
结果是非0,则第i个比特位是1
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//0000 0010
for (int i = 31; i >= 1 ; i-=2) {
System.out.print(((n>>>i) & 1) + " " );
}
System.out.println();
for (int i = 30; i >= 0 ; i-=2) {
System.out.print(((n>>>i) & 1) + " " );
}
}
//获取一个二进制序列中的所有偶数位和奇数位,分别输出二进制序列
//eg:2的二进制序列位10 偶数位:1 奇数位:0
// 4的二进制序列位100 偶数位:0 奇数位:1 0
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int []arr=new int[16];//用于存放奇数位,一个数32位,奇/偶数位最高16位
int []brr=new int [16];//用于存放偶数位
int i=0;
int j=0;
int k=0;
for(i=1;i<=32;i++)//获取输入数的末位数字
{
if(i%2!=0)//奇数位
{
arr[j]=n&1;
//比如n=1010,n&1
// 1=0001
// n&1=0000=0,获取到了n的末位
j++;
n>>>=1;//无符号右移
}
else
{
brr[k]=n&1;
k++;
n>>>=1;
}
}
System.out.println("现打印奇数位:");
for(i=0;i<16;i++)
{
System.out.print(arr[15-i]+" ");
}
System.out.println();
System.out.println("现打印偶数位:");
for(i=0;i<16;i++)
{
System.out.print(brr[15-i]+" ");
}
}