问题描述:给定一个M数制的整数x,转换为N数制的数并输出;
问题分析:数制的任意转换需要清除数制与数制之间的转换关系,一般来说十进制与其他数制的转换是较为简单和有规律的;所以可以先将改数制转换为十进制数再转换为N进制数;
算法设计:
1.输入一个整数M作为其起始的数制
2.输入一个M数制的数:由于十进制以上的数会用字符A--Z来表示,所以要用一个字符型数组才可以完全储存该数;
3.将X转换为十进制数:由于第n位转换为十进制代表M的n-1次方;所以可以使用一个累乘函数来简化这个次方求和过程;该函数输入两个整数,第一个整数表示求的次方,第二个整数表示是哪个数的次方;
该字符数组中的数字字符可以用x[i]-‘0’的方式实现;而字符部分则可以用x[i]-‘A’+10的方式实现转换;
4.十进制转换为N进制:10进制转换为N进制的数可以与N求余得第一位数;除以N后再与N求余得第二位数;由此循环,并由vector函数储存每一次求余结果,最后倒序输出vector便可以得到该N进制数,要注意,N进制数如果某一位大于10需要将其转换为字母,可用‘A’+X[i]-10的char强制转换得到;
源代码:
# include<iostream>
# include<vector>
using namespace std;
int a(int i, int k)
{
int p=1;
for (int j = 0; j < i; j++)
{
p *= k;
}
return p;
}
vector <int> m;
int main ()
{
int M;
cin >> M;
string k;
int n = 0;
cin>> k;
n = k.size();
int q=0;
for (int i=0; n > 0; n--,i++)
{
int o = a(n-1, 10);
int p = 1;
if(k[i]>='0' && k[i] <= '9'){p = k[i] - '0';}
if(k[i]>='A' && k[i] >= 'Z'){p = k[i] - 'A'+10;}
q += p * a(n - 1, M);
}
int N;
cin >> N;
for (int i = q; i > 0; i /= N)
{
m.push_back(i % N);
}
for (int i = m.size()-1; i >=0; i--)
{
if (m[i] >= 10) { cout << (char)('A' + m[i] - 10); }
else cout << m[i];
}
return 0;
}
标签:10,转换,进制,int,数制,十进制 From: https://www.cnblogs.com/Snor9/p/17334398.html