Javase-5.逻辑控制的习题

1. 根据年龄 , 来打印出当前年龄的人是少年 ( 低于 18), 青年 (19-28), 中年 (29-55), 老年 (56 以上 )
Scanner sc = new Scanner(System.in);
int age = sc.nextInt();

if(age > 0 && age <= 18) {
    System.out.println("是少年");
} else if(age >= 19 && age <= 28) {
    System.out.println("是青年");
} else if(age >= 29 && age <= 55){
    System.out.println("是中年");
} else {
    System.out.println("是老年");
}
2. 打印 1 - 100 之间所有的素数
for (int j = 1; j <= 100; j++) {
    int i = 2;
    for (; i < Math.sqrt(j); i++) {
        if(j % i == 0) {
            break;
        }
    }if(i > Math.sqrt(j)) {
        System.out.println(j +"是素数");
    }
}
3. 输出 1000 - 2000 之间所有的闰年
Scanner scan = new Scanner(System.in);
int year = scan.nextInt();
int count = 0;
for (int year = 1000; year <= 2000; year++) {
    if (year % 100 == 0) {
        if (year % 400 == 0) {
            System.out.println(year + "is 闰年");
            }
        }else {
        if (year % 4 == 0) {
            System.out.println(year + "is 闰年");
        }
    }
}
4.输出乘法口诀表
//1*1 = 1
//2*1 = 2 2*2 = 4
//3*1 = 3 3*2 = 6 3*3 = 9
//...
//不难发现第一行有一个表达式,第二行有两个,第三行有三个...
//所以内循环从1到i
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.printf("%d*%d = %2d ",i,j,i*j);
    }
    System.out.printf("\n");
}
5.求两个正整数的最大公约数
法一:
Scanner scan = new Scanner(System.in);
int number1 = scan.nextInt();
int number2 = scan.nextInt();
int min = number1 > number2 ? number2 : number1;
while(true) {
    if(number1 % min == 0 && number2 % min == 0) {
        break;
    }
    min--;
}
System.out.println(min + "is 最大公约数");

上述解法是比较朴素的解法 -- 硬解,拿到两个数中的较小数,再利用循环,找到能同时被两个数整除的最大数。

法二:辗转相除法:假设有两个数a和b,a % b = c; 将b赋值给a,即a = b;将c赋值给b,即b = c;继续 进行a%b(a = b, b = c),直到a % b为零,此时b即为a和b的最大公约数。

以24与18为例,24和18的最大公约数为6,

  计算过程:    24 % 18 = 6, 18 % 6 = 0,6为最大公因数,

 那么如果一开始是 18 % 24有没有影响呢? 我们来看, 18 % 24 = 18; 24赋值给%左边的变量,18赋值给%右边的变量,又变成 24 % 18了,所以没有影响.可能讲得有点抽象,直接看代码.

Scanner scan = new Scanner(System.in);
int number1 = scan.nextInt();
int number2 = scan.nextInt();
int tmp = number1 % number2;//假设为24 % 18
while(tmp != 0) {
    number1 = number2;//number1 = 18
    number2 = tmp;//number2 = 6
    tmp = number1 % number2;//tmp = 18 % 6
}
System.out.println(number2 + "is 最大公约数");
6.求出 0 999 之间的所有 水仙花数 并输出。 (“ 水仙花数 是指一个三位数,其各位数字的立方和确好等于该数
本身,如: 153 1^3 5^3 3^3 ,则 153 是一个 水仙花数 )
分析:1.想要求出3位的水仙花数的先拿到它的个位数,十位数和百位数
        2.利用 Math.pow(number,3);//可以得到nember的三次方.
for (int i = 0; i <= 999; i++) {
    int count = 0;
    //假设i = 123
    int tmp = i;
    while(i != 0) {
        count++;
        i /= 10;
    }
    i = tmp;
    int sum = 0;
    while(tmp != 0) {
        sum += Math.pow(tmp % 10,count);
        tmp /= 10;
    }
    if(sum == i) {
        System.out.println(i + "is 水仙花数");
    }
}

7.打印 X 图形

只需注意到当i == j或者i+j = n-1时为 * ,那么这道题就好写了

Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
    int a = sc.nextInt();
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < a; j++) {
            if(i == j || i + j == a-1) {
                System.out.print("*");
            }else{
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

8.编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输入,最多输入三次。三次均错,则提示退出程序

int count = 3;
Scanner sc = new Scanner(System.in);
while(count != 0) {
    System.out.println("请输入密码:");
    String password = sc.nextLine();
    if(password.equals("123456")) {
        System.out.println("登录成功!");
        break;
    }else{
        System.out.println("密码错误,你还有"+ (count-1) +"次机会");
        count--;
    }
}

9.获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列

int n = 7;//0000 0000 0000 0000 0000 0000 0000 0111
                                               31...4 3 2 1
   第32位为符号位不用管,只算到31,第一位(奇数位)上的数字:1,第二位(偶数位)上的数字:1,第三位(奇数位)...第三十一位(奇数位)上的数字:0.
从第一位开始每+两位都是奇数位,同里从第二位开始每+2都是偶数位.
所以for(int i = 1;i <= 30,i += 2)表示奇数位上的数字,为了打印出来的顺序与0000 0000 0000 0000 0000 0000 0000 0111一致,故将for(int i = 1;i <= 30,i += 2)倒过来写:for(int i = 30;i >= 0; i -= 2),偶数位也同理

for (int i = 30; i >= 0; i -= 2) {
    System.out.print( ((n >> i) & 1) + " ");
}//右移>>: 最右位去掉,正数在最左补0,负数补1.&:如果两个二进制位都是 1,则结果为 1,否则结果为 0.
System.out.println();
for (int i = 31; i >= 1; i -= 2) {
    System.out.print( ((n >> i) & 1) + " ");
}

以上所有练习的答案或许有不足的地方,还望各位多多包涵!

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值