概述
由于整数与小数的进制转化不同,此题我们应用到栈与队列
代码如下:
#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++ 的简单代码的全部内容,希望文章能够帮你解决进制转换 C++ 的简单代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复