除2取余法

要求:

  1. 给一个十进制数n,求出n二进制各个数位的和

方法:

  1. 除以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。

如果把每位的数值做标记:

  1. 定义temp变量,在处理个位的时候值为1,循环结束后乘2
  2. temp的值依次变为1,2,4,8,16…
  3. temp也可以表示别的意义,如:处理个位的时候为0,循环结束后加1,这样就是求该位2的乘方的形式
  4. 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;
}


原创文章 85 获赞 86 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43699840/article/details/105826656
今日推荐