首页 > 试题广场 >

求int型正整数在内存中存储时1的个数

[编程题]求int型正整数在内存中存储时1的个数
  • 热度指数:402168 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的 \sf{int} 型的十进制正整数 n ,统计其在内存中存储时 1 的个数。换句话说,即统计其二进制表示中 1 的个数。

输入描述:
\hspace{15pt}在一行上输入一个整数 n \left( 0 \leqq n < 2^{31} \right) ,代表给定的数字。


输出描述:
\hspace{15pt}在一行上输出一个整数,代表 n 的二进制表示中 1 的个数。
示例1

输入

10

输出

2

说明

\hspace{15pt}十进制 110 的二进制表示如下:
\hspace{23pt}\bullet\,十进制 (1)_{10} 等于二进制 (1)_{2}
\hspace{23pt}\bullet\,十进制 (2)_{10} 等于二进制 (10)_{2}
\hspace{23pt}\bullet\,十进制 (3)_{10} 等于二进制 (11)_{2}
\hspace{23pt}\bullet\,十进制 (4)_{10} 等于二进制 (100)_{2}
\hspace{23pt}\bullet\,十进制 (5)_{10} 等于二进制 (101)_{2}
\hspace{23pt}\bullet\,十进制 (6)_{10} 等于二进制 (110)_{2}
\hspace{23pt}\bullet\,十进制 (7)_{10} 等于二进制 (111)_{2}
\hspace{23pt}\bullet\,十进制 (8)_{10} 等于二进制 (1000)_{2}
\hspace{23pt}\bullet\,十进制 (9)_{10} 等于二进制 (1001)_{2}
\hspace{23pt}\bullet\,十进制 (10)_{10} 等于二进制 (1010)_{2}
示例2

输入

0

输出

0
//利用与运算
#include<stdio.h>

int main() {
    unsigned int n;
    while (scanf("%u", &n) != EOF) {
        int count=0;
        while (n) {
            n = n & (n - 1);//每次相与消去一个1,直到最后n变为0
            count++;
        }
        printf("%d", count);
    }
}

发表于 2024-09-11 21:49:07 回复(0)
#include <stdio.h>
int main() {
    int a;
    scanf("%d", &a);
    int count=0;
    while(1){
        if(a==0){
            break;
        }
        if(a%2==1){
        count++;
        }
        a/=2;
    }
    printf("%d", count);
    return 0;
}
发表于 2024-08-05 18:46:51 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
    int num;

    int count = 0;
    scanf( "%d", &num);
    while (num) {
        int tmp = num % 2;
        num /= 2;
        if (tmp == 1) {
            count++;
        }
    }
    printf("%d", count);
    return 0;
}


发表于 2024-06-26 17:47:23 回复(0)
//直接利用十进制转换二进制的手动计算原理
#include <stdio.h>

int main() {
    int num;
    scanf("%d", &num);
    int count = 0;
    while(num != 0){
        if(num % 2 == 1) {
            count++;
        }
        num/=2;
    }
    printf("%d", count);
    return 0;
}
编辑于 2024-03-05 16:30:16 回复(0)
这种东西搞嵌入式的天天搞吧。。
#include <stdio.h>

int main() {

    int InputNum = 0,NumofOne = 0;
    scanf("%d",&InputNum);
    for(int i = 0;i < 32;i++)
    {
        if((InputNum >> i) & 1)
        {
            NumofOne++;
        }
    }
    printf("%d",NumofOne);
    return 0;
}

发表于 2024-01-08 10:35:06 回复(0)
#include <stdio.h>

int main() {
    int a, b, cnt = 0;
    while (scanf("%d", &a) != EOF) {
        while (a != 0) {
            b = a % 2;
            a /= 2;
            if (b == 1) {
                cnt++;
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

编辑于 2023-12-24 14:58:18 回复(0)
#include <stdio.h>
int main() {
    int a,yu = 0,sum = 0;
    scanf("%d",&a);
    while(a>0) {yu = a%2; a = a/2; sum += yu;}
    printf("%d",sum);
    return 0;
}

发表于 2023-12-02 13:18:36 回复(0)
位运算
#include <stdio.h>

int main() {
int a, b = 0;
while (scanf("%d", &a) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
for(int i = 0;i <= 31;i++)
{
if((0x1<<i)&a)
b++;
}

printf("%d\n",b);
}
return 0;
}
发表于 2023-10-12 10:29:28 回复(0)
#include <stdio.h>

int main() {
    int n,count=0;
    scanf("%d",&n);
    while (n>0)
    {
        if(n%2!=0)
            count++;
        n/=2;

    }
    printf("%d",count);
    return 0;
}
发表于 2023-09-03 11:13:20 回复(0)
//利用除二取余法将十进制转换为二进制,判断余数为1的个数即可。
#include <stdio.h>
int main() {
   long int a;
   int n=0;
    scanf("%ld",&a);
    while(a!=0)
    {        
        if(a%2==1)
        n++;
        a=a/2;
    }
    printf("%d",n);
    return 0;
}
发表于 2023-07-29 11:10:52 回复(0)
利用二进制原理是吧整数分解成不同的二的次方项相加,得到要最高次方项后相减并计数即可逐步算出结果

#include <stdio.h>
#include <math.h>
int main()
{
    int n,m=0;
    scanf("%d",&n);
    for(int i=1;i<=32;)
    {
        if(n==0)break;
        if(pow(2,i)>n)
        {
        m++;
        n=n-pow(2,i-1);
        i=1;}
        else
        i++;
    }
    printf("%d\n",m);
    return 0;
}
发表于 2023-06-11 18:10:15 回复(0)
#include <stdio.h>

int main() {
    int num,count;
    while(scanf("%d",&num) != EOF){
        count = 0;
        while(num){
            if(num%2==1){
                count ++;
            }
            num /= 2;
        }
    }
    printf("%d",count);
    return 0;
}
发表于 2023-06-07 16:22:30 回复(0)
要用while做循环,for也行
#include <stdio.h>

int main() {
    int n;
    scanf("%d\n",&n);
    int num=0;
    while(n>1){
        if(n%2==1){
            num++;
        }
        n=n/2;
    }
    num++;
    printf("%d\n",num);
    return 0;
}


发表于 2023-03-29 17:34:52 回复(0)
转化为进制问题,不用考虑输出,只用累加是1的量;
#include <stdio.h>

int main() {
    int n;
    scanf("%d" , &n);
    int num = 0;
    int z;
    do{
        z = n % 2;
        if(z == 1){
            num++;
        }
        n = n / 2;

    }while(n != 0);
    printf("%d" , num);
    return 0;
}



发表于 2023-03-15 10:41:30 回复(0)
#include <stdio.h>

int main() {
    int num;
    scanf("%d", &num);
    int c = 0;
    do{
        c += num&1;
        num = num >> 1;
    }while(num != 0);

    printf("%d", c);

    return 0;
}

发表于 2022-10-14 19:20:49 回复(0)
#include<stdio.h>
int main(){
    int num,count=0;
    scanf("%d\n",&num);
    
    while((num/2)!=0){
        if(num%2==1)
            count++;
        num=num/2;
    }
    count++;
    printf("%d",count);
    return 0;
}
发表于 2022-08-26 22:18:17 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int n;
    scanf("%d",&n);
    int count = 0;
    while(n!=0)
    {
        if((n&0x00000001) == 1)
        {
            count++;
        }
        n = (n >> 1);
    }
    printf("%d\n",count);
    return 0;
}
发表于 2022-06-16 15:23:23 回复(0)
#include <stdio.h>

int main()
{
    int recv;
    scanf("%d",&recv);
    int num = 0;
    
    while(1)
    {
        if(recv & 0x01 == 0x01)
            num++;
        
        recv = recv >> 1;
        if(recv == 0)
            break;
    }
    printf("%d\n",num);
}

发表于 2022-05-22 23:54:37 回复(0)

问题信息

难度:
38条回答 100149浏览

热门推荐

通过挑战的用户

查看代码
求int型正整数在内存中存储时1的个数