要求:
- 给一个十进制数n,求出n二进制各个数位的和
方法:
- 除以2取余法,将值相加即可
#include<iostream>
using namespace std;
int main()
{
int n, temp = 0, num = 0;
cin >> n;
num = n;
int ans = 0;
while (n>0)
{
ans += n % 2;
n /= 2;
temp++;
}
cout << ans << endl;
return 0;
}
eg: 6=110,有2个1; 1023=1111111111,有10个1。
如果把每位的数值做标记:
- 定义temp变量,在处理个位的时候值为1,循环结束后乘2
- temp的值依次变为1,2,4,8,16…
- temp也可以表示别的意义,如:处理个位的时候为0,循环结束后加1,这样就是求该位2的乘方的形式
- eg:45=25+23+23+20
#include<iostream>
using namespace std;
int main()
{
int n, temp = 1, num = 0;
cin >> n;
num = n;
int ans = 0;
while (n>0)
{
ans += n % 2;
n /= 2;
temp *= 2;
}
cout << ans << endl;
return 0;
}
例题:
题目描述
B市的工人们天天抱着脑袋,因为食品生产线上,他们用0和1来表示是否添加原料,而原料的种类,总计多达20种……
更头疼的是,电路板上的数位,对于工人来说是一个不小的难题。电路板上的LED屏幕总是把0和1的数据,转化成一个十进制的数,于是每次,工人们就会天天计算12039这种数字的二进制位,这让工人们很头疼
对于一个数字x(0<x<1000000),我们想要将它化成简单二进制数相加的形式,7=4+2+1,43=32+8+2+1,这样的一个小工具对于在电路板上头疼的工人来说好像非常有用,因为他们在之前的头疼训练中已经背会了2从0到20的乘方……
输入
一个数字x,表示LED屏幕的数字
输出
一个等式,x=Ei+Ej+Ek+…+E0,其中,Ei,Ej,Ek….是从大到小的2的乘方
样例输入
43
样例输出
43=32+8+2+1
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int x;
cin >> x;
int temp = 1, num = 0;
num = x;
int ans = 0;
vector<int>v;
while (x > 0)
{
//需要记录时
if (x%2==1)
{
v.push_back(temp);
}
x /= 2;
temp *= 2;
}
cout << num << '=';
for (int i = v.size()-1; i >=1 ; i--)
{
cout << v[i] << '+';
}
cout << v[0] << endl;
return 0;
}