进制转换
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入一个十进制数N,将它转换成R进制数输出。
输入
输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。
输出
为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。
示例输入
7 2 23 12 -4 3
示例输出
111 1B -11
///手写模拟栈233333 (估计要不是不能用STL都不手写了)
///此题坑点 0 !另外注意 long long
///ACcode
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define maxsize 100000
#define ll long long
typedef struct Stack
{
int Size;
char *top,*base;
} Stack;
bool Empty(Stack &s)
{
if (s.top == s.base)
{
return 1;
}
return 0;
}
void Creat(Stack &s)
{
s.base=new char[maxsize];
s.top=s.base;
s.Size=maxsize;
}
void push(Stack &s,char e[])
{
if (s.top-s.base >= s.Size)
{
s.base=(char *)realloc(s.base,2*maxsize*sizeof(Stack));
s.Size+=maxsize;
}
s.top++;
*s.top=e[0];
}
void pop(Stack &s)
{
if (s.top != s.base)
{
s.top--;
}
}
void print(Stack &s)
{
while (!Empty(s))
{
cout<<*s.top;
pop(s);
}
cout<<endl;
}
void change(Stack &s,ll x,ll mod)
{
int m;
if (x<0)
{
x=-x;
}
char nu[3];
while(x)
{
m=x%mod;
if (m==10)
{
nu[0]='A';
}
else if (m==11)
{
nu[0]='B';
}
else if (m==12)
{
nu[0]='C';
}
else if (m==13)
{
nu[0]='D';
}
else if (m==14)
{
nu[0]='E';
}
else if (m==15)
{
nu[0]='F';
}
else nu[0]=m+'0';
push(s,nu);
x=x/mod;
}
}
void sign(Stack &s,ll x)
{
if (x<0)
{
push(s,"-");
}
}
int main()
{
ll n,m;
while (cin>>n>>m)
{
if (n==0)
{
cout<<"0"<<endl;
}
else
{
Stack s;
Creat(s);
change(s,n,m);
sign(s,n);
print(s);
Clear(s);
}
}
return 0;
}