数制转换

问题描述:给定一个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;
}

 

posted @ 2023-04-19 19:28  Snor9  阅读(152)  评论(0)    收藏  举报