题目解析
计算老板抹掉零头后应收的钱
解题思路
方法1: 位运算
通过位运算的方法,每次将这个数在二进制中最后一个1变为0
| 操作 | 二进制数 |
|---|---|
| n | 1010 |
| n - 1 | 1001 |
| n & (n - 1) | 1000 |
方法2: 累乘
通过累乘的方法,每次对一个数进行 *2 的操作,直至这个数 *2 后超过给定的 n
代码
方法1: 位运算
import java.io.*;
import java.math.*;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
int n = sc.nextInt();
while ((n & (n - 1)) != 0)
{
n = n & (n - 1);
}
out.println(n);
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}
方法2: 累乘
import java.io.*;
import java.math.*;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
int n = sc.nextInt();
int ans = 1;
while (ans * 2 <= n)
{
ans = ans * 2;
}
out.println(ans);
out.flush();
out.close();
}
static Scanner sc = new Scanner(System.in);
static PrintWriter out = new PrintWriter(System.out);
}