1、题目

2、思路
先得到2^0-2^31次方的数值,用arr[i] (i>=0;i<=31)存起来
假设输入的值为num,则从大遍历arr[i],num-arr[i]>0这个arr[i]就是我们要的,此时i的位置就是1,即1*2^i=arr[i]
因为求的是1的个数,所以只要求有多少个1就行了
3、代码
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str=sc.nextLine();
int num=Integer.parseInt(str);
int[] arr=new int[32];
for(int i=0;i<=31;i++){arr[i]=(int)Math.pow(2,i);}
int flag=0;
//找到最近的一个大于num的数,从这个数开始遍历会提高效率.
for(int i=31;i>=0;i--){
if(arr[i]<num) {
flag=i+1; break;
}
}
//System.out.println(flag);
int res=0;
while(num>0){
for(int i=flag;i>=0 ;i--){
if(num-arr[i]>=0) {num=num-arr[i];res++;break;}
}
}
System.out.println(res);
}
}