weixin_43866982
weixin_43866982
采纳率0%
2018-11-30 15:49 阅读 959

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条回答 默认 最新

  • crf_moonlight crf_moonlight 2018-11-30 18:13
    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', '')))
    
    
    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2018-11-30 21:02

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

    #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;
    }
    

    图片说明

    点赞 评论 复制链接分享