进制转换 sdutoj1252(模拟手写栈2333333)

来源:互联网 发布:linux 压缩文件命令 编辑:程序博客网 时间:2024/05/16 10:16

进制转换

Time Limit: 1000MS Memory limit: 65536K

题目描述

输入一个十进制数N,将它转换成R进制数输出。

输入

输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。

输出

为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。

示例输入

7 223 12-4 3

示例输出

1111B-11

///手写模拟栈233333 (估计要不是不能用STL都不手写了)

///此题坑点 0 !另外注意 long long

///ACcode

#include <iostream>#include <cstring>#include <cstdlib>using namespace std;#define maxsize 100000#define ll long longtypedef 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;}

0 0
原创粉丝点击