十进制转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)