所有类型的数据在内存中都是以二进制的形式存放的。其中有些位是 1,而有些位是 0。例如:字符 A 的二进制表示 01000001 中有 2 位是 1,6 位是 0。设 sizeof(char) 为 1。
数据密度定义为一块内存数据中 1 的位的占比。
写程序计算一组字符的数据密度。
Input
第 1 行:整数 n (1≤n≤10)
第 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); }