2018ACM新生赛(热身赛)

星澈是信息技术学院中一位非常普通的学子,他除了脸盲外,还有一个缺点,就是他的数学非常差,简直就是一个“数学黑洞”,一天,他又被一道非常简单的题目难住了,这道题是这样的:“将一个十进制数转为二进制,并计算出二进制数中有多少个数字1”,你能帮帮他吗?

输入要求
第一行输入一个整数T(1<=T<=100),表示接下来有T组数据
每组数据包含一个N,代表需要计算的数字。(N<=100,000)

输出要求
对于每个测试样例,输出两行,第一行为转换后的2进制数,第二行为2进制数中1的个数。

测试数据
输入示例
3
6
66
666

输出示例
Case #1:
110
2
Case #2:
1000010
2
Case #3:
1010011010
5

2个回答

T = int(input())
for i in range(T):
  n = int(input())
    n_bin = bin(a)[2:]
    print(n_bin)
    print(len(n_bin) - len(n_bin.replace('1', '')))

如果问题得到解决,请点我回答左上角的采纳和向上的箭头,谢谢

#include "stdio.h"
#include "string.h"

#define MAX 21

int cnt(char * s)
{
    int n = 0;
    while (*s != '\0')
    {
        if (*s == '1')
            n++;
        s++;
    }
    return n;
}

char* trim(char * s)
{
    char *p = s;
    while (*p == '\0') p++;
    return p;
}

void conv(char arr[], int n)
{
    char * p = &arr[MAX - 2];
    if (n == 0) { *p = '0'; return; }
    while (n)
    {
        *p = n % 2 + '0';
        n /= 2;
        p--;
    }
}

int main()
{
    char ans[100][MAX];
    memset(ans, 0, 100 * MAX * sizeof(char));
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        int m;
        scanf("%d", &m);
        conv(ans[i], m);
    }
    for (int i = 0; i < n; i++)
    {
        printf("Case #%d:\n", i + 1);
        printf("%s\n", trim(ans[i]));
        printf("%d\n", cnt(trim(ans[i])));
    }
    return 0;
}

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐