我们要想统计十进制数字中出现的1的个数,只需要对这个数字进行“/10”与“%10”运算。比如对数字119,119 % 10 = 9,我们得到了这个数字的个位数,观察其个位数与1是否相等,相等的话1的个数就加一;然后进行整除运算119 / 10 = 11,由此我们丢弃了这个数字的个位数,得到了这个数字的前两位数。依次类推,我们再...
这样的方法复杂度为二进制的位数,即 ,于是可是想一下,有没有只与二进制中1的位数相关的算法呢。 可以考虑每次找到从最低位开始遇到的第一个1,计数,再把它清零,清零的位运算操作是与一个零,但是在有1的这一位与零的操作要同时不影响未统计过的位数和已经统计过的位数,于是可以有这样一个操作 n&(n-1) ,...
同理,对于得到整数的每一个二进制位,我们可以通过%2,/2的方式,得到该整数的每一个二进制位 代码如下 intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n/=2;}returncount;} 测试 #include <stdio.h>intNumberOf1(intn){intcount=0;while(n){if(n%2==1){count++;}n/=2;}re...
int main(){ int a,i=0,j,k=0,m;int b[30];scanf("%d",&a);while(a>0) //十进制转换为二进制 { b[i]=a%2;a/=2;i++;} for(j=0;j<i;j++) //计算1的个数 if(b[j]==1)k++;printf("%d\n",k);//1的总数 for(j=0;j<i/2;j++){m=b[j];b[j]=b[...
【c语言】统计一个数二进制中的1的个数,//统计一个数二进制中的1的个数#includeintcount(inta){intcount=0;while(a){count++;a=a&(a-1);}returncount;}intmain(){printf("%d\n",count(1...
void Convert(int n){ int i=0,count=0,j,t;int a[20]={0};while(n!=1&&n!=0)//转换二进制 { a[i]=n%2;n=n/2;i++;} if(n!=0)a[i]=1;t=i;while(i!=-1)//输出二进制 { printf("%d",a[i]);i--;} for(j=0;j<=t;j++)//统计1的个数 { if(a[j]==...
用我们平时十进制转换二进制的算法,即短除法。例如:x&(x-1) 当x=5时,5的二进制是0101 0101&(0101-1) == 0101&0100==01000100&(0100-1) == 0100&0011==0000一共计算了两次,也就是说5的二进制数一共只有2个1.下面是代码实现:
int main(){ int a;int b[1000],i,x0,x1,k,c;x0=0;x1=1;printf("请输入十进制数a\n");scanf("%d",&a);if(a == 0){ printf("十进制数0转成二进制数为0\n");printf("1的个数为0\n");printf("0的个数为1\n");} c = a;for(i=0;i<1000;i++)b[i]=0;i=0;...
为了交换字符串,它使用了一个临时字符串s。 代码语言:javascript 复制 intcompare_s(char*s1,char*s2)//定义比较字符串大小的函数//模拟实现strcmp{int i=0;//把函数返回值初始化为0while(*s1&&*s2)//当字符串未结束时,执行该循环{s1++;//未比较出大小则继续比较下一位,故使指针增加1s2++;//未比较出...
用我们平时十进制转换二进制的算法,即短除法。例如:x&(x-1) 当x=5时, 5的二进制是0101 0101 & (0101-1) == 0101 & 0100 == 0100 0100 & (0100-1) == 0100 & 0011 == 0000 一共计算了两次,也就是说5的二进制数一共只有2个1.下面是代码实现: