[蓝蓝计算机考研算法训练二期]-day22

127 阅读1分钟

31、输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

数据范围:- 2^31 <= n <= 2^31-1

即范围为:-2147483648<= n <= 2147483647

示例1

输入:

10

返回值:

2

说明:

十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。      

示例2

输入:

-1

返回值:

32

说明:

负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1

思路

将得到的数字分别与1按位与运算,将得到的结果放入字符数组中,然后再将字符数组进行遍历,如果为1,则count累加,遍历完成后输出即可。

具体实现

#include <stdio.h>
#include <stdlib.h>

char *toBinary(int num)
{
    char *binary = (char *)malloc(sizeof(char) * 33);
    int flag = 1;
    int i;

    for (i = 31; i >= 0; i--)
    {
        if (num & flag)
        {
            binary[i] = '1';
        }
        else
        {
            binary[i] = '0';
        }
        flag << 1;
    }
    binary[32] = '\0';

    return binary;
}

int main()
{
	int n,count = 0;
    char *tmp;
    
    scanf("%d", &n); 
    tmp = toBinary(n);
    for(int i = 0;i < 32;i++) {
    	if(tmp[i] == '1')
    		count++;
	}
    free(tmp);
    tmp = NULL;
    printf("%d", count);

    return 0;
}

image.png

image.png

小结

对于数字的运算不一定非得要以数字来进行,可以以字符数组或者字符串的形式来得到想要的结果,最后输出即可。