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


    目录

    1.求二进制1的个数

     2.计算分数的值

    3. 水花仙数

    4. 打印X图形

     5.输出乘法口诀表

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

     7.模拟登陆

     8.二进制序列


    1.求二进制1的个数

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

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

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

    代码实现

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

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

    优化1

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

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

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

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

    优化2

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

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

     2.计算分数的值

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

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

    3. 水花仙数

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

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

    拓展

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

    1. public static void main(String[] args) {
    2. for (int i = 1; i <=9999999 ; i++) {
    3. int count = 0;
    4. int sum = 0;
    5. int tmp = 0;
    6. tmp = i;
    7. while(tmp!=0){
    8. tmp /= 10;
    9. count++;//得到i是几位数
    10. }
    11. tmp = i;
    12. while(tmp!=0){
    13. sum = sum + (int)Math.pow(tmp%10,count);
    14. tmp /= 10;
    15. }
    16. if(sum == i){
    17. System.out.print(i+" ");
    18. }
    19. }
    20. }

    4. 打印X图形

    题目描述:

     思路:

    1. public static void main(String[] agrs){
    2. Scanner scan = new Scanner(System.in);
    3. while(scan.hasNextInt()){ //多行输入
    4. int n = scan.nextInt();
    5. for(int i=0;i
    6. for(int j=0;j
    7. if(i==j || i+j==n-1){
    8. System.out.print("*");
    9. }
    10. else{
    11. System.out.print(" ");
    12. }
    13. }
    14. System.out.println();
    15. }
    16. }
    17. }

     5.输出乘法口诀表

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

    1. public static void main(String[] args) {
    2. Scanner scan =new Scanner(System.in);
    3. int n = scan.nextInt();
    4. for (int i = 1; i <=n ; i++) {
    5. for (int j = 1; j <= i; j++) {
    6. System.out.print(j+"*"+i+"="+i*j+" ");
    7. }
    8. System.out.println();
    9. }
    10. }

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

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

    1. public static void main(String[] args) {
    2. Scanner scan = new Scanner(System.in);
    3. int n = scan.nextInt();
    4. while(n!=0){
    5. System.out.println(n%10);
    6. n /= 10;
    7. }
    8. }

     7.模拟登陆

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

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

     8.二进制序列

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

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

  • 相关阅读:
    【WFA】【WIFI6】HE-5.31.2_6G Fail
    大数据集群中部署Hive
    命令模式
    MyBatis-Plus学习笔记
    【vue3】Suspense组件和动态引入defineAsyncComponent的搭配使用
    扩大图片手势的点击范围的方法
    MyBatis的各种查询功能
    不一样的纯H5C3动画爱心
    两款开源的工作流引擎快速开发框架源码
    d3dcompiler43.dll是什么?d3dcompiler43.dll缺失怎么解决?
  • 原文地址:https://blog.csdn.net/qq_62712350/article/details/126063812