进制转换 C++ 的简单代码

由于整数与小数的进制转化不同,此题我们应用到栈与队列

代码如下:  

 

 

 

#include<iostream.h>
#include<malloc.h>
#include<stdio.h>

//栈的结构体,用于计算小数点前的数字,即整数部分
typedef struct linknode
{
 int data;//整数
 struct linknode *next;//指针域
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s)
{
    s=new LinkStNode;
 s->next=NULL;
}
//进栈 ---------头插法
void push(LinkStNode *&s,int &i)
{
 LinkStNode *p;
 p=new LinkStNode;
 p->data=i;
 p->next=s->next;
 s->next=p;
 
}
//  出栈
bool pop(LinkStNode *&s,int &j)
{
 LinkStNode *p;
 if(s->next==NULL)
  return false;
 p=s->next;
 j=p->data;
 s->next=p->next;
 free(p);
 return true;
}
//销毁栈
void des(LinkStNode *&s)
{
 LinkStNode *pre=s,*p=s->next;
 while(s!=NULL)
 {
  delete pre;
  pre=p;
  p=pre->next;
 }
 delete pre;

}
//进制转化的小数点前的整数部分
/*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
  当除以进制数商为0时,
  over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
{
 int z;
 do
 {
  z=x%b;  //余数
  x=x/b;  //商
  push(s,z);
 }while(x!=0);
 while(pop(s,z))
 {
  if(z<10)
   cout<<z;
  else
   cout<<char(z-10+65);  //10代表A啊
 }

}

//队列的结构体
typedef struct qnode
{
 int data;
 struct qnode *next;
}datanode;

typedef struct
{
 datanode *front;
 datanode *rear;
}QueueNode;
//初始化队列
void InitQueue(QueueNode *&q)
{
 q= new QueueNode;
 q->front=q->rear=NULL;
}
//进队列

void enQueue(QueueNode *&q,int i)
{
 datanode *p;
 p=new datanode;  //
 p->data=i;
 p->next=NULL;
 if(q->rear==NULL)  //
  q->front=q->rear=p;
 else
 {
  q->rear->next=p;//将结点p链到队尾,并将rear指向它
  q->rear=p;
 }
}

//出队列
bool deQueue(QueueNode *&q,int &i)
{
 datanode *t;
 if(q->rear==NULL)  //空则无法出列
  return false;
 t=q->front;
 if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
  q->front=q->rear=NULL;
 else
  q->front=q->front->next;
 i=t->data;
 free(t);
 return true;
}


//处理小数点后的转换
/*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
    小数部分继续乘以进制数,
    直到小数部分为0(但有时会算不尽,因此应有精度)*/
void Game2(QueueNode *&q,double a,int b)//处理到8个数
{
 int p=0;
 int r;
 while(p<28&&a!=0)
 {
  p++;
  r=int(a*b);   //进队
  enQueue(q,r);
  a=a*b-r;    //小数点后的值 
 }
 cout<<".";
 while(deQueue(q,r))
 {
  if(r<10)
   cout<<r;
  else
   cout<<char(r-10+65);
 }

}
//主函数
void main()
{
 double a;  //小数
 int b;
 while(1)
 {
  cout<<"请输入想转换的数字:";
  cin>>a;
  cout<<"请输入想转换的进制:";
  cin>>b;
  cout<<endl;
  cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
  LinkStNode *s; //栈指针  先进后出
  QueueNode *q;  //队列指针 先进先出
  InitStack(s);
  int x=int(a);  //整数部分
  Game1(s,x,b);
  InitQueue(q);
  double y=a-x;  //小数部分
  Game2(q,y,b);
  cout<<endl;
 }

   //3.最后将输出栈+小数点+队列的值即可。

}

我的答案:

#include<iostream.h>
#include<malloc.h>
#include<stdio.h>

//栈的结构体,用于计算小数点前的数字,即整数部分
typedef struct linknode
{
 int data;//整数
 struct linknode *next;//指针域
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s)
{
    s=new LinkStNode;
 s->next=NULL;
}
//进栈 ---------头插法
void push(LinkStNode *&s,int &i)
{
 LinkStNode *p;
 p=new LinkStNode;
 p->data=i;
 p->next=s->next;
 s->next=p;
 
}
//  出栈
bool pop(LinkStNode *&s,int &j)
{
 LinkStNode *p;
 if(s->next==NULL)
  return false;
 p=s->next;
 j=p->data;
 s->next=p->next;
 free(p);
 return true;
}
//销毁栈
void des(LinkStNode *&s)
{
 LinkStNode *pre=s,*p=s->next;
 while(s!=NULL)
 {
  delete pre;
  pre=p;
  p=pre->next;
 }
 delete pre;

}
//进制转化的小数点前的整数部分
/*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
  当除以进制数商为0时,
  over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
{
 int z;
 do
 {
  z=x%b;  //余数
  x=x/b;  //商
  push(s,z);
 }while(x!=0);
 while(pop(s,z))
 {
  if(z<10)
   cout<<z;
  else
   cout<<char(z-10+65);  //10代表A啊
 }

}

//队列的结构体
typedef struct qnode
{
 int data;
 struct qnode *next;
}datanode;

typedef struct
{
 datanode *front;
 datanode *rear;
}QueueNode;
//初始化队列
void InitQueue(QueueNode *&q)
{
 q= new QueueNode;
 q->front=q->rear=NULL;
}
//进队列

void enQueue(QueueNode *&q,int i)
{
 datanode *p;
 p=new datanode;  //
 p->data=i;
 p->next=NULL;
 if(q->rear==NULL)  //
  q->front=q->rear=p;
 else
 {
  q->rear->next=p;//将结点p链到队尾,并将rear指向它
  q->rear=p;
 }
}

//出队列
bool deQueue(QueueNode *&q,int &i)
{
 datanode *t;
 if(q->rear==NULL)  //空则无法出列
  return false;
 t=q->front;
 if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
  q->front=q->rear=NULL;
 else
  q->front=q->front->next;
 i=t->data;
 free(t);
 return true;
}


//处理小数点后的转换
/*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
    小数部分继续乘以进制数,
    直到小数部分为0(但有时会算不尽,因此应有精度)*/
void Game2(QueueNode *&q,double a,int b)//处理到8个数
{
 int p=0;
 int r;
 while(p<28&&a!=0)
 {
  p++;
  r=int(a*b);   //进队
  enQueue(q,r);
  a=a*b-r;    //小数点后的值 
 }
 cout<<".";
 while(deQueue(q,r))
 {
  if(r<10)
   cout<<r;
  else
   cout<<char(r-10+65);
 }

}
//主函数
void main()
{
 double a;  //小数
 int b;
 while(1)
 {
  cout<<"请输入想转换的数字:";
  cin>>a;
  cout<<"请输入想转换的进制:";
  cin>>b;
  cout<<endl;
  cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
  LinkStNode *s; //栈指针  先进后出
  QueueNode *q;  //队列指针 先进先出
  InitStack(s);
  int x=int(a);  //整数部分
  Game1(s,x,b);
  InitQueue(q);
  double y=a-x;  //小数部分
  Game2(q,y,b);
  cout<<endl;
 }

   //3.最后将输出栈+小数点+队列的值即可。

}

我的答案:

#include<iostream.h>
#include<malloc.h>
#include<stdio.h>

//栈的结构体,用于计算小数点前的数字,即整数部分
typedef struct linknode
{
 int data;//整数
 struct linknode *next;//指针域
}LinkStNode;
//初始化栈
void InitStack(LinkStNode *&s)
{
    s=new LinkStNode;
 s->next=NULL;
}
//进栈 ---------头插法
void push(LinkStNode *&s,int &i)
{
 LinkStNode *p;
 p=new LinkStNode;
 p->data=i;
 p->next=s->next;
 s->next=p;
 
}
//  出栈
bool pop(LinkStNode *&s,int &j)
{
 LinkStNode *p;
 if(s->next==NULL)
  return false;
 p=s->next;
 j=p->data;
 s->next=p->next;
 free(p);
 return true;
}
//销毁栈
void des(LinkStNode *&s)
{
 LinkStNode *pre=s,*p=s->next;
 while(s!=NULL)
 {
  delete pre;
  pre=p;
  p=pre->next;
 }
 delete pre;

}
//进制转化的小数点前的整数部分
/*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
  当除以进制数商为0时,
  over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
{
 int z;
 do
 {
  z=x%b;  //余数
  x=x/b;  //商
  push(s,z);
 }while(x!=0);
 while(pop(s,z))
 {
  if(z<10)
   cout<<z;
  else
   cout<<char(z-10+65);  //10代表A啊
 }

}

//队列的结构体
typedef struct qnode
{
 int data;
 struct qnode *next;
}datanode;

typedef struct
{
 datanode *front;
 datanode *rear;
}QueueNode;
//初始化队列
void InitQueue(QueueNode *&q)
{
 q= new QueueNode;
 q->front=q->rear=NULL;
}
//进队列

void enQueue(QueueNode *&q,int i)
{
 datanode *p;
 p=new datanode;  //
 p->data=i;
 p->next=NULL;
 if(q->rear==NULL)  //
  q->front=q->rear=p;
 else
 {
  q->rear->next=p;//将结点p链到队尾,并将rear指向它
  q->rear=p;
 }
}

//出队列
bool deQueue(QueueNode *&q,int &i)
{
 datanode *t;
 if(q->rear==NULL)  //空则无法出列
  return false;
 t=q->front;
 if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
  q->front=q->rear=NULL;
 else
  q->front=q->front->next;
 i=t->data;
 free(t);
 return true;
}


//处理小数点后的转换
/*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
    小数部分继续乘以进制数,
    直到小数部分为0(但有时会算不尽,因此应有精度)*/
void Game2(QueueNode *&q,double a,int b)//处理到8个数
{
 int p=0;
 int r;
 while(p<28&&a!=0)
 {
  p++;
  r=int(a*b);   //进队
  enQueue(q,r);
  a=a*b-r;    //小数点后的值 
 }
 cout<<".";
 while(deQueue(q,r))
 {
  if(r<10)
   cout<<r;
  else
   cout<<char(r-10+65);
 }

}
//主函数
void main()
{
 double a;  //小数
 int b;
 while(1)
 {
  cout<<"请输入想转换的数字:";
  cin>>a;
  cout<<"请输入想转换的进制:";
  cin>>b;
  cout<<endl;
  cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
  LinkStNode *s; //栈指针  先进后出
  QueueNode *q;  //队列指针 先进先出
  InitStack(s);
  int x=int(a);  //整数部分
  Game1(s,x,b);
  InitQueue(q);
  double y=a-x;  //小数部分
  Game2(q,y,b);
  cout<<endl;
 }

   //3.最后将输出栈+小数点+队列的值即可。

}

  • 进制转换 C++ 的简单代码