任意进制控制输入转为二进制递归输出

此文章为转载 ,侵删。

#include <iostream>
using namespace std;
void BinaryRecursion(int n);
//递归输出二进制函数
int main()
{
    int n;
    cin>>hex>>n;
    BinaryRecursion(n);
    cout<<endl;
    cout<<n<<endl;
    return 0;
}
void BinaryRecursion(int n)
{
    int a;
    a = n % 2; // 取余
    n = n >> 1;  //右移一位 相当于除以2
    if(0 != n)
    {
        BinaryRecursion(n);
    }
    cout<<a;
}

在这里插入图片描述
使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。假设调用该递归函数的主函数为第0层,则从主函数调用递归函数进入第1层;从第i层递归调用本身为进入“下一层”,即第i+1层。反之,退出第i层递归应返回至“上一层”,即第i-1层。

为了保证递归函数正确执行,系统需设立一个“递归工作栈”作为整个递归函数运行期间使用的数据存储区。每一层递归所需信息构成一个“工作记录”,其中包括所有的实参、所有的局部变量以及上一层的返回地址。

每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归就从栈顶弹出一个工作记录,则当前执行层的工作记录必须是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。

如上图所示:当n 不等于0时,保存当前层的“工作记录”,然后递归调用进入下一层,直到n 等于0 ,此时是第四层,把当前层的a值
1 打印出来,然后退出第4层递归,返回至“上一层”即第4 – 1 层,即第3层。然后打印此层的a值 0,依次递归返回打印其余层。最后得到结果为
1010.

指定数据输出宽度:用C++提供的函数setw()指定输出数据项的宽度。setw()括号中通常给出一个正整数值,用于限定紧跟其后的一个数据项的输出宽度。如:setw(8)表示紧跟其后的数据项的输出占8个字符宽度。setw()只能限定紧随其后的一个数据项,输出后即回到默认输出方式。使用setw()必须在程序开头再增加一句: #include

  1. 在接收输入时,必须在cin中指明数制,否则从键盘输入时,不认八进制和十六进制数开头的0和0x标志。指明后可省略0和0x标志。

  2. 进制控制只适用于整型变量,不适用于实型和字符型变量。

  3. 输入数据的格式、个数和类型必须与cin中的变量一一对应,否则不仅使输入数据错误,而且影响后面其他数据的正确输入。

  4. 在cin或cout中指明数制后,该数制将一直有效,直到重新指明使用其他数制。

void Binarycout(int n)
{
	for(int i = 31; i>= 0; i--)
	{
		cout<<((n>>i)&1);
	}
	cout<<endl;
}

也可以用位运算

容器list还有bitset的方法现在还未掌握,先写在这里

void BinaryVector(int n)
{
	int temp;
	temp = n;
	list <int> L;
	while(0 != temp)
	{
		L.push_front(temp % 2);
		temp = temp >> 1;
	}
 
	for(list <int>::iterator iter = L.begin(); iter != L.end(); iter++)
	{
		cout<<*iter;
	}
	cout <<endl;
}
void BinaryBitset(int n)
{
	cout<<bitset<sizeof(int)*8>(n)<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_43935092/article/details/88550491