不支持小数,不支持负数。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <math.h>
using namespace std;
/**********************************************************/
///将十进制转化为其他进制
void D_to(int m, long long x)
{
if (x == 0)
{
cout << x;
return;
}
stack<int> s;
//将数据边处理边压栈
while (x != 0)
{
int p = x % m;
s.push(p);
x /= m;
}
//边判断边出栈
while (!s.empty())
{
if (s.top() >= 10)
cout << (char)(s.top() + 55);
else
cout << s.top();
s.pop();
}
cout << endl;
}
/**********************************************************/
/**********************************************************/
///将其他进制转化为十进制
long long to_D(int n, string y)
//需要让原数据在确定是其他进制转10进制后再输入,因为在这种情况下,原数据不一定是整型数,所以,为了适用于所有情况,要设原数据为char[]
{
char up[26] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
char low[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
// cout<<"截止到"<<up[n-10-1]<<endl; //因为超过10的进制,允许使用的字母个数不相同。不能只判断到“F”,那只是16进制的情况
stack<int> s;
//先把数据压进栈
for (int i = 0; i < y.length(); i++)
{
///这里千万当心:要分成n<10和n>=10的情况来做。如果不这样做,则错误例子为“n=4,m=5,y=666”和“n=18,m=7,y=GA980H17CB”.
///对于第一个例子,可以用“&& y[i]<(n+'0')”解决,因为n=4,是一个字符。但这种方法解决不了第二个反例,因为n=18,是两个字符,加上'0'没有实际意义
if (n < 10)
{
if (y[i] < (n + '0'))
s.push(y[i] - '0');
else
{
cout << "输入错误" << endl; //遇到非法或超出范围的字符
exit(0);
}
}
else
{
if (y[i] >= '0' && y[i] <= '9')
s.push(y[i] - '0'); //将数字字符转化为整型
//要使用“&& y[i]<=low[n-10-1]”,而非简单的“&& y[i]<=‘F’”
else if (y[i] >= 'a' && y[i] <= low[n - 10 - 1])
s.push(y[i] - 87); //将大写字母转化为整型
else if (y[i] >= 'A' && y[i] <= up[n - 10 - 1])
s.push(y[i] - 55); //将小写字母转化为整型
else
{
cout << "输入错误" << endl; //遇到非法或超出范围的字符
exit(0);
}
}
}
//边计算,边出栈
int i = 0;
long long sum = 0;
while (!s.empty())
{
sum += s.top() * pow(n, i);
i++;
s.pop();
}
// cout<<sum<<endl;
return sum;
}
/**********************************************************/
int main()
{
int n; // n为原始数据的进制
int m; // m为目标数据的进制
long long x; // x为原始数据(十进制整数)
string y; // y为原始数据(不确定进制的字符串表示的数)
string z; // z为原始数据(不确定进制的字符串表示的数)
while (1)
{
cout << "请输入原始数据的进制:";
cin >> n;
cout << "请输入目标数据的进制:";
cin >> m;
if (n == m)
{
cout << "【不用算了,还是本身】" << endl;
}
else if (n == 0 || m == 0)
{
cout << "【无法计算】" << endl;
}
else if (n == 10 && m != 10)
{
cout << "请输入原始数据:";
cin >> x;
D_to(m, x);
}
else if (m == 10 && n != 10)
{
cout << "请输入原始数据:";
cin >> y;
cout << to_D(n, y) << endl;
}
else if (n != 10 && m != 10)
{
cout << "请输入原始数据:";
cin >> z;
///先把原始数据转成十进制,再把十进制转化为目标进制数
long long temp = to_D(n, z);
D_to(m, temp);
}
cout << endl;
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。