ECNU OJ 2893 数据密度

所有类型的数据在内存中都是以二进制的形式存放的。其中有些位是 1,而有些位是 0。例如:字符 A 的二进制表示 01000001 中有 2 位是 1,6 位是 0。设 sizeof(char) 为 1。

数据密度定义为一块内存数据中 1 的位的占比。

写程序计算一组字符的数据密度。

Input

第 1 行:整数 n (1n10)

第 2 行 ~ n+1 行:每行是个数范围为 1 ~ 120 的一组字符。一组字符中可能包含空格、制表符、汉字、字母、数字、标点符号。

Output

对于每一行中的一组字符,以最简分数形式在一行中输出其数据密度。

分数格式:分子 / 分母

#include <stdio.h>
#include <string.h>
void solve(char *s);
int gcd(int a, int b){
    return a ? gcd(b % a, a) : b ;
}

int main ()
{
    int T;
    scanf("%d", &T);
    while(T--){
        char s[121];
        gets(s);
        solve(s);
        return 0; 
    }
}

void solve(char *s)
{
    int s1  = 0, bytes=strlen(s), i, j;
    for (int i = 0; i < bytes; i++){
        unsigned char c= s[i]; //为了使用逻辑右移,定义为无符号字符类型
        for (j = 0; j < 8; j++){
            s1 += c % 2; //统计1的位数
            c>>=1; //逻辑右移
        }
    }
    int g = gcd(s1, bytes * 8);//最大公约数
    printf ("%d/%d", s1/g, bytes * 8 / g);

}

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注