您的位置:首页 > 其它

第五周项目4-数制转换

2016-09-29 11:30 375 查看
问题及代码:

/*

copyright (t) 2016,烟台大学计算机学院

*All rights reserved.

*文件名称:1.cpp

*作者:常锐

*完成日期:2016年9月29日

*版本号:v1.0

*问题描述:把十进制的整数转换为任一进制数输出。请利用栈设计算法,并实现程序。

*输入描述:任意一个十进制整数(这里不考虑超精度问题)

*程序输出:转换后的r进制数(2<=r<=9)

*/

#include <stdio.h>
#include <malloc.h>
typedef int Elemtype;
typedef struct node
{
int data;
struct node *next;
} LiStack;
void InitStack(LiStack *&l)
{
l=(LiStack *)malloc(sizeof(LiStack));
l->next=NULL;
}
void DestroyStack(LiStack *&l)
{
LiStack *pre=l,*p=l->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(pre);
}
bool StackEmpty(LiStack *l)
{
return (l->next==NULL);
}
void Push(LiStack *&l,Elemtype e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=l->next;
l->next=p;
}
bool Pop(LiStack *&l,Elemtype &e)
{
LiStack *p;
if(l->next==NULL)
return false;
p=l->next;
e=p->data;
l->next=p->next;
free(p);
printf("%d",e);
return true;
}
bool GetTop(LiStack *l,Elemtype &e)
{
if(l->next==NULL)
return false;
e=l->next->data;
return true;
}
void NumReversal(int n,int r)
{
LiStack *s;
InitStack(s);
Elemtype e;
while(n>0)
{
e=n%r;
Push(s,e);
n/=r;
}
while(!StackEmpty(s))
Pop(s,e);
printf("\n");
}
int main()
{
int n,r;
while(scanf("%d %d",&n,&r)!=EOF)
NumReversal(n,r);
return 0;
}


运行结果:



知识点总结:

        栈的应用问题

心得体会:

        结合提示,此问题并不难分析;此外此题应用顺序栈和链栈均可解决,用顺序栈更为清晰(涉及一片连续存储空间)。

PS:补充一种数组常规解法^_^

#include <stdio.h>
void reversenum(int n,int r)
{
int a[100];
int i,len=0;
while(n>0) //除r取余
{
a[len]=n%r;
n/=r;
len++;
}
for(i=len-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
int main()
{
int n; //待转换的数
int r; //转换后的进制
while(scanf("%d %d",&n,&r)!=EOF)
reversenum(n,r);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: