八道简单入门编程题详解+拓展(水花仙,二进制序列……)

目录

1.求二进制1的个数

 2.计算分数的值

3. 水花仙数

4. 打印X图形

 5.输出乘法口诀表

6.输出一个整数的每一位

 7.模拟登陆

 8.二进制序列


1.求二进制1的个数

求一个整数,在内存当中存储时,二进制1的个数。

思路:把该整数和1按位与,如果得到的数为1,二进制1的个数+1,再右移该整数,继续按位与1,直到移动到第一位符号位为止,一共要右移31次。

例如:求整数9,再内存当中储存时二进制的个数

代码实现


    public static void main(String[] args) {
        int a= 9;
        int count =0;
        for (int i = 0; i < 32; i++) {
            if(((a>>i)&1)==1){
                count++;
            }
        }
        System.out.println(count);
    }

a右移i次,再按位与1,循环进行了32次,但是只右移了31次,因为第一次i=0 

优化1

我们可以不可以对这个代码进行优化呢?我们发现不管给的整数是多少,改代码都会右移31次,然后得到最终答案,这样做显然效率是不高的。

我们可以每次把a右移一位之后判断a是否等于0.如果等于0就退出循环。


    public static void main(String[] args) {
        int a = 9;
        int count = 0;
        while(a != 0){
            if((a & 1)==1){
                count++;
            }
            a=a>>>1;//无符号右移
        }
        System.out.println(count);
    }

这里使用无符号右移原因是,如果a是一个负数,普通右移就会补一个1,这样永远数不完

优化2

我们还可以对这个代码进行怎样的优化呢?


    public static void main(String[] args) {
        int a = 9;
        int count = 0;
        while(a!=0){
            a=a&(a-1);
            count++;
        }
        System.out.println(count);
    }

 2.计算分数的值

计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值 。


    public static void main(String[] args) {
        double sum = 0.0;//用浮点数存储小数
        int flag = 1;
        for (int i = 1; i <=100 ; i++) {
            sum = sum + (flag)*1.0/i;//写成1.0是因为我们需要小数点后面的数字
            flag = -flag;
            
        }
        System.out.println(sum);
    }

3. 水花仙数

求出0~n之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本 身,如;153=1^3+5^3+3^3,则153是一个“水仙花数“。)

public static void main(String[] args) {
        for (int i = 100; i <= 999; i++) {
            int sum = 0;
            int tmp = i;//把i的值赋给tmp保证i的值不变,否则会死循环
            while(tmp!=0){
                sum = sum+(int)Math.pow(tmp%10,3);//math.pow的返回值是double类型,需要强转成int类型
                tmp /= 10;
            }
            if(sum == i){
                System.out.println(i);
            }
        }
    }

拓展

根据这个规律我们能否写一个代码,求得1位数到7位数的所有水花仙数呢?

public static void main(String[] args) {
        for (int i = 1; i <=9999999 ; i++) {
            int count = 0;
            int sum = 0;
            int tmp = 0;
            tmp = i;
            while(tmp!=0){
                tmp /= 10;
                count++;//得到i是几位数
            }
            tmp = i;
            while(tmp!=0){
                sum = sum + (int)Math.pow(tmp%10,count);
                tmp /= 10;
            }
            if(sum == i){
                System.out.print(i+" ");
            }
        }
    }

4. 打印X图形

题目描述:

 思路:

public static void main(String[] agrs){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()){  //多行输入
            int n = scan.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.println();
            }
        }
    }

 5.输出乘法口诀表

输出n*n的乘法口诀表,n由用户输入

public static void main(String[] args) {
        Scanner scan =new Scanner(System.in);
        int n = scan.nextInt();
        for (int i = 1; i <=n ; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j+"*"+i+"="+i*j+" ");
            }
            System.out.println();
        }
    }

6.输出一个整数的每一位

 输出一个整数的每一位,如:1234的每一位是4,3,2,1

 public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        while(n!=0){
            System.out.println(n%10);
            n /= 10;
        }
    }

 7.模拟登陆

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

   public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int count = 3;
        while(count!=0) {
            System.out.println("请输入密码,你还有" + count + "次机会");
            String pass = scan.nextLine();
            if (pass.equals("shiyanan123")) {//判断输入的字符串是否正确
                System.out.println("密码正确,登录成功");
                break;
            } else {
                System.out.println("密码错误,登录失败");
            }
            count--;
        }
    }

 8.二进制序列

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

 public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.print("奇数位: ");
        for (int i = 31; i >=1 ; i=i-2) {
            System.out.print(((n>>i) & 1)+" ");
        }
        System.out.println();
        System.out.print("偶数位: ");
        for (int j = 30; j>=0 ; j=j-2) {
            System.out.print(((n>>j) & 1)+" ");
        }
    }

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值