代码是转载别人的,然后我加了一点注释。
先附上转载链接二进制数数代码实现
顺便说明一下真正的取余过程。
十进制转二进制:用十进制数除以二进制数,得到的每一位余数就是二进制数的构成,但是要倒序输出才是正常的二进制。
过程如下:
比如整数10
10%2 = 0; 10/2= 5;
5%2 = 1; 5/2 = 2;
2%2 = 0;
2/2 =1;注意上一步中因为余数已经为0了,同时下一步中 1/2 = 0;所以除法到这里结束。
前面都是取余数,最后一位是商,如果商为0则为0,商为1则为1;
然后我们反过来输出它,从下往上就是:1010;
比如整数7
7%2 = 1; 7/2 = 3;
3%2 = 1;
3/2 = 1; 除法到这结束,因为下一步中 1/2=0了
1%2 = 0;
同样反过来输出,就是:0111;也可以直接111,把0省略
不管是转二进制还是转八进制或者是转十六进制,只要是谁转谁,那就用谁除以谁,取余数,直到为0,然后反向输出即可!
下面是我注释后的代码。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int number(int n)
{
char c;
int a[100000];
int num = 0;
int i;
for(i=0;;i++) //十进制转二进制取余,用10除以2
{
a[i] = n%2; //每一个二进制数放到数组里面 真正的数字是倒序存放的
n /= 2; //每次取余完成都要n/2,
num++; //计算有多少个二进制位
if(!n) //当n为0时,计算结束,转换完成。
break;
}
int count = 0;
for(i=0;i<num;i++) //二进制中1的个数
{
if(a[i] == 1)
count++; //count是该十进制数转化为二进制数中1的个数
}
return count;
}
int main()
{
int l,r;
cin>>l>>r;
int i;
int sum = 0;
for(i=l;i<=r;i++)
{
sum +=number(i); //对L到R个数进行求和计算。
}
cout<<sum;
return 0;
}