进制转化——10进制转化为 m进制及n进制转化为m进制
首先说说10进制转化为m进制,(2<=m<=16),输入一个n(long long范围),大于10用A,B,C,D,E,F表示,输出他转化为m进制的后(用数组实现)
思路
m进制转化为10进制相信大家都会,每一个位上的数组乘pow(m,位数所在位置-1)的总和,那么10进制怎么转成m进制就将这个过程反过来即可,即一直n%m,用整形数组记录n%m的值,每一次循环完n/=m进入下一次循环,直到n为0停止,这时数组里面存的就是要转化后对应数字的逆序,
但是我们怎么将大于10的数字转化为字母,其实加个特判就行了。
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int arr[101];
int main()
{
long long int a, b,i=0;
scanf("%lld%lld", &a, &b);
while (a)
{
arr[i++] = a % b;
a /= b;
}
if (b < 10)
{
for (long long int j = i - 1; j >= 0; j--)
{
printf("%d", arr[j]);
}
}
else
{
for (long long int j = i - 1; j >= 0; j--)
{
if (arr[j] < 10)
{
printf("%d", arr[j]);
}
else if(arr[j]>=10)
{
printf("%c",(char)(arr[j]+65-10));
}
}
}
return 0;
}
下面解决给了一个m进制数字转化为n进制问题,输入有三行,第一行表示要转化的n进制(整数),第二行为该进制数(字符串),第三行为要转化的m进制(整数)。
输出只有一行 转化后的m进制
思路:即就在第一部分加一个转化10进制即可
代码如下:
//此处我将转化10进制弄成了函数(此代码只能算int,想算long long可以自己改改,有不足欢迎大家来告知)
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
using namespace std;
int arr[101];
char su[101];
int fun(char arr[], int n1, int n2)//n1 weishu n2 zhuanghua
{
int num = 0;
if (n2 <= 10)
{
for (int i = 0; i < n1; i++)
{
num = num * n2 + (arr[i] - '0');
}
}
else
{
for (int i = 0; i < n1; i++)
{
if (arr[i] >= 'A')
{
num = num * n2 + (arr[i] - 'A' + 10);
}
else
{
num = num * n2 + (arr[i] - '0');
}
}
}
return num;
}
int main()
{
int n,b;//start jinzhi the end
scanf("%dn%sn%d", &n, su, &b);
int s1 = strlen(su);
int a, i = 0;
a = fun(su, s1, n);
while (a)
{
arr[i++] = a % b;
a /= b;
}
if (b < 10)
{
for (int j = i - 1; j >= 0; j--)
{
printf("%d", arr[j]);
}
}
else
{
for (int j = i - 1; j >= 0; j--)
{
if (arr[j] < 10)
{
printf("%d", arr[j]);
}
else if (arr[j] >= 10)
{
printf("%c", (char)(arr[j] + 65 - 10));
}
}
}
return 0;
}