十进制转k进制 k进制转十进制

十进制转k进制

手算方法:

例如,205.345(10) =11001101.01011(2) ,转化时分为整数部分和小数部分

整数部分:除以k取余,写的时候从下往上将余数写出来即可
小数部分:乘以k取整,写的时候从上往下将竖式的整数部分写出来即可
在这里插入图片描述

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

void TentoAny(LL num,int k)//十进制数转化为 k进制(2<=k<=36)
{
	vector<char> v;//不定长数组
	LL t;//余数 
	while(num)
	{
		t=num%k;
		if(t>=10)v.push_back((char)('A'+t-10));//向尾部添加元素
		else v.push_back((char)(t+'0'));
		num/=k;
	}
	for(int i=v.size()-1;i>=0;i--)//先算出来的余数最后输出(逆序列)
		cout<<v[i];
	cout<<endl;
}
int main()
{
	LL n;
	int k;
	cin>>n>>k;
	TentoAny(n,k);
	return 0;
}

代码借鉴: https://blog.csdn.net/zqf3535/article/details/80197900

运行测试:

100(10) =1100100(2)
在这里插入图片描述

k进制转十进制

手算方法:

第n位原本的数 x kn-1
整数部分与小数部分计算方法相同。整数部分最低位个位 n=1,小数部分最高位 n=0
在这里插入图片描述

也就是位权与基数的概念,上面写的kn-1就是位权,k就是基数:(图都是百度找的)
在这里插入图片描述

代码实现:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL AnytoTen(string num,int k)//k进制转化为十进制(2<=k<=36)
{
	LL ans=0,tmp=1;//任何K的 0次幂为1
	int n=num.length();
	for(int i=n-1;i>=0;i--)//从低位开始 
	{
		int base;//该位本来的数
		if(num[i]>='A'&&num[i]<='Z')
			base=num[i]-'A'+10;
		else base=num[i]-'0';//字符转化成数字
		ans+=tmp*base;//0次幂为1
		tmp*=k; 
	}
	return ans;
} 
int main()
{
	string n;
	int k;
	cin>>n>>k;
	cout<<AnytoTen(n,k);
	return 0;
}

代码借鉴: https://blog.csdn.net/zqf3535/article/details/80197900

运行测试:

32(16) =50(10)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42324771/article/details/87861112