将一个十进制数x转换为任意进制数m(m<16)
递归:
#include
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int turn(int n, int k)//将n转为k进制
{
int r=0;
r = n%k;
n = n/k;
if(n!=0) turn(n,k);
printf("%c",d[r]);
}
int main()
{
int x, m;
scanf("%d%d",&x,&m);
turn(x,m);
return 0;
}
非递归
#include
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char a[100];
int turn(int n,int k)
{
int r = 0;
while(n!=0)
{
a[++r] = n%k;
n = n/k;
}
for(int j = r; j >= 1; -- j)
printf("%c",d[a[j]]);
}
int main()
{
int x, m;
scanf("%d%d",&x,&m);
turn(x,m);
return 0;
}
更新:2020.3.10
任意进制转十进制
1101(2)= 1*2^0 + 0 * 2^1 + 1 *2^2 + 1* 2^3
ABC(16) = C*16^0 + B*16^1 + A*16^2 = 12*16^0 + 11*16^1 + 10*16^2
这里需要注意计算时需要将字母转成数字进行计算。比如A=>10 F=>15
'A'-'0'-7 即可将字符‘A'转成数字 10
用ans记录每一项相加的结果,用k来记录位数计算到几次方了。
#include
using namespace std;
int r_to_ten(string s, int r)//A2(16)=2*16^0+A*16^1=162 r进制的数s转成10进制
{
int len = s.length();
int ans = 0;//记录每一项相加的结果
int k = 1;//记录位数
for(int i = len-1; i >= 0; i--){
if(s[i] >= 'A') ans += (s[i]-'0'-7)*k;//大于10的数需要将字母转成数字
else ans += (s[i]-'0')*k;//小于10的数直接相乘即可
k*=r;
}
return ans;
}
int main()
{
cout << r_to_ten("12323",4) << endl;//443
cout << r_to_ten("A2",16);//162
return 0;
}
十进制转任意进制
123(10) 转为2 进制,需要不断的除以2,余数倒序输出。
数组的做法:
#include
using namespace std;
string r_to_ten(int n, int r)//将10进制的n转为r进制 23 2
{
char str[105] = {0}, s[105] = {0};
int k = 0;
while(n!=0)
{
str[k++] = n%r;//将余数直接存起来
n = n/r;
}
int m = 0;
for(int i = k-1; i >= 0; --i)//倒序输出余数即为转换后的答案
{
if(str[i] >= 10 ) s[m++] = str[i] - 10 + 'A';//大于10时数字转字符 如10 -> A
else s[m++] = str[i] + '0';//数字转字符
}
return s;
}
int main()
{
cout << r_to_ten(1024,16);
return 0;
}
栈的做法:
#include
using namespace std;
string r_to_ten(int n, int r)//将10进制的n转为r进制 23 2
{
char s[105] = {0};
int k = 0;
stack str;
while(n!=0)
{
str.push(n%r);//将余数存在栈中
n = n/r;
}
int m = 0;
while(!str.empty())//倒序输出余数即为转换后的答案
{
int t = str.top();
if(t >= 10 ) s[m++] = t - 10 + 'A';//大于10时数字转字符 如10 -> A
else s[m++] = t + '0';//数字转字符
str.pop();
}
return s;
}
int main()
{
cout << r_to_ten(1235,8);
return 0;
}