一文搞懂负进制

进制转化
之前学进制转化只是学个方法,也没去探究原理,借这道题先来整理一下,原理
14 ( b a s e 10 ) 14(base10) 14(base10)转换为二进制,
14 / 2 = 7 ⋯ 0 14/2=7\cdots0 14/2=70
7 / 2 = 3 ⋯ 1 7/2=3\cdots1 7/2=31
3 / 2 = 1 ⋯ 1 3/2=1\cdots1 3/2=11
1 / 2 = 0 ⋯ 1 1/2=0\cdots1 1/2=01
所以 14 ( b a s e 10 ) = 1110 ( b a s e 2 ) 14(base10)=1110(base2) 14(base10)=1110(base2),如果除以base有余数就表示,这个位置在这个数的表示占有比重,如 16 ( b a s e 10 ) = 10000 ( b a s e 2 ) 16(base10)=10000(base2) 16(base10)=10000(base2),因为 16 = 2 4 16=2^4 16=24,所以其他位置都没有比重。
再看一下负进制,原理与正进制差不多,都是除以base,但是会出现余数为负数的情况,这种情况肯定是不行的,于是找到如下公式
被 除 数 = 商 ∗ 除 数 + 余 数 = 余 数 − 除 数 − ( 商 + 1 ) ∗ 除 数 被除数=商*除数+余数=余数-除数-(商+1)*除数 =+=+1)
这样就能把负的余数化为正的了,代码如下

#include<iostream>
#include<cstdio>
using namespace std;
char trans(int);
int main()
{
	int n,base,t,num=0;
	cin>>n>>base;
	cout<<n<<'=';
	int arr[10];
	while(n)
	{
		arr[num]=n%base;
		n/=base;
		if(arr[num]<0)
		{
			arr[num]-=base;
			n++;
		}
		
		num++;	
	}
	
	for(t=num-1;t>=0;t--)
	{
		cout<<trans(arr[t]);
	}
	printf("(base%d)",base);
}

char trans(int number)
{
	if(number<10&&number>=0)
		return number+'0';
	else return number-9+64;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值