十进制数
文章目录
- 题目
- 代码(c语言)
- 解析
- 小结
题目
1)问题描述:将从键盘输入的十进制数转换为N(如二进制,八进制,十六进制)进制数据。
2)要求:利用顺序栈实现数制转换问题
代码(c语言)
#include<stdio.h>
#include<stdlib.h>
//定义栈结构
typedef struct stack{
int num[50];
int tap;
}Stack;
//声明函数
void setTable(char* table);
void push(int number);
int pop();
int isempty();
//声明全局变量
Stack *stack;
void main(){
int number,radix; //number-被转换数 radix-转换进制
char table[36]; //定于数字字母匹配表
setTable(table);
printf("输入十进制数字:");
scanf("%d",&number);
printf("输入要转换的进制:");
scanf("%d",&radix);
stack = (Stack*)malloc(sizeof(Stack));
stack->tap=0;
//短除法
while(true){
push( number % radix);
number = number/radix;
if(number == 0)break;
}
printf("结果为:");
while(isEmpty() == 0){
printf("%c",table[pop()]);
}
putchar(10);//换行
}
//填充数字字母表
void setTable(char table[]){
int i = 0;
for(;i<10;i++){
table[i]='0'+i;
}
for(;i<37;i++){
table[i]='A'+i-10;
}
}
//入栈
void push(int number){
stack->num[stack->tap] = number;
stack->tap = stack->tap + 1;
}
//出栈
int pop(){
stack->tap = stack->tap - 1;
return stack->num[stack->tap];
}
//判断是否为空
int isEmpty(){
if(stack->tap == 0)return 1;
else return 0;
}
解析
1.题目思路
因为这是一道10进制转换N进制的题目,所以算法应该采用短除法
EG:十进制:10 转换成 二进制:1010
(第一次) 10%2 = 0 , 10/2 = 5
(第二次) 5 % 2 = 1 , 5/2 = 2
(第三次) 2 % 2 = 0 , 2/2 = 1
(第四次) 1 % 2 = 1 , 1/2 = 0
这时候发现规律了吧----短除算法计算的结果是从低位开始的(逆序的)。
那么,这样一种方式就可以利用栈的先进后出特性来得到正确的结果。
2.实现的方法
- 需要有一张表可以表示0-9 A-Z的字符
- 在循环中,每次短除的余数压入栈中,直到被除数为0为止。需要得到结果的时候,再一个一个地出栈并且去数字字母表找到匹配字符进行保存或者输出。
小结
在一些需要逆序操作的时候,可以考虑下栈或者是递归
相关阅读
Collecting Luggage - UVALive 2397 - 蓝桥杯 算法训
vjudge 题目链接 vj速度第一哈哈 玄学优化 = 。= 二分,最短路,计算几何 问题描述 航班结束后,提取行李的过程并不琐碎。手提箱和行
1.strcpy函数 原型:strcpy(str1,str2); 功能:将字符串str2复制到字符串str1中,并覆盖str1原始字符串,可以用来为字符串变量赋值 返回
动态规划,存在1元,3元,5元硬币若干,使用最少硬币构成n元
题目描述:存在一元,三元,五元硬币若干,如何用最少的硬币凑够11元。看到最少这个字眼,我们可以进行判断能否通过动态规划进行求解,经过分
LinkedIn 全球副总裁:从 0 到 5 亿用户的增长历程
优质的产品和服务才是增长的基石。大家好,我是 Aatif Awan,我在 LinkedIn 的主要工作是领导增长团队、推动产品国际化和用户增长。
一、背景 实时计算应用主要分为以下四类:(1)ETL:ETL应该是目前实时计算最普遍的应用场景。例如在TDBank的数据链路中,TDSort读取消息缓