为了提升我这个小白的编程能力和算法能力,所以我觉得每天用一部分时间来牛客网来练习
每天练习的题目我会发到这里进行分析和其中知识点讲述
希望有和我一样希望提升自己的小伙伴,每一期能指点出我的我的错误和不足
接下来让我们进入正题
牛客华为机试 <---点击进入题目页面
题目
描述
输入一个 int 型的正整数,计算出该 int 型数据在内存中存储时 1 的个数。
数据范围:保证在 32 位整型数字范围内
输入描述:
输入一个整数(int类型)
输出描述:
这个数转换成2进制后,输出1的个数
首先我们需要简单了解内存中二进制数据存储
分为两种情况:
(1)无符号:不考虑正负数
0000 0000 ~ 1111 1111 ==> 0~255
(2)有符号:-128~127
0000 0000 ~ 0111 111 ==> 0~127
1000 0001 ~ 1111 1111 ==> -127 ~ -1
1000 0000 ==> -128 特殊值,最高位既是符号位,又是数值位
解析:
题目中说到输出一个int型的正整数,由此我们分析
一个int型整数占4个字节32个bit位,在内存中存储为长度32位二进制的数据
有两种方法:
方法一:位与运算 num & 1; num = num >> 1;
方法二:取模运算 N % 2 ==1; N /= 2;
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Get_One_Number(long int x)
{
int count = 0;
while (x > 0)
{
if (x % 2 == 1)
{
count++;
}
x /= 2;
}
return count;
}
int main()
{
long int i = 0;
scanf("%d", &i);
int ret = Get_One_Number(i);
printf("%d\n", ret);
return 0;
}
方法2:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int Get_One_Number(long int x)
{
int count = 0;
while (x != 0)
{
count += x & 1;
x = x >> 1;
}
return count;
}
int main()
{
long int i = 0;
scanf("%d", &i);
int ret = Get_One_Number(i);
printf("%d\n", ret);
return 0;
}
这道题还是很简单的,但是可以拓展我们的思路和解题方法