开开心心学算法--十进制转任意进制

这个不是在线的ACM题,是我自己想的。用到了栈的操作。能将十进制转换成64进制内的任何进制数。程序里面用大小写英文字母加‘#’和‘*’号表示了从10到63的数字。具体见程序。

首先是栈的相关函数实现,文件为:stack.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
#define StkType int

typedef struct {
	StkType *base;
	StkType *top;
	int stacksize;
}SqStack;

int InitStack(SqStack *S)
{
	S->base=(StkType *)malloc(STACK_INIT_SIZE *sizeof(StkType));
	if(!S->base)
		return 0;
	S->top=S->base;
	S->stacksize=STACK_INIT_SIZE;
	return 1;
}

int GetTop(SqStack *S,StkType *ch)
{
	if(S->top == S->base)
		return 0;
	*ch = *(S->top - 1);
	return 1;
}

int Push(SqStack *S,StkType ch)
{
	if(S->top - S->base >= S->stacksize)
	{
		S->base=(StkType *)realloc(S->base,(S->stacksize + STACKINCREMENT)* sizeof(StkType ));
		if(!S->base)
			return 0;
		S->top=S->base+S->stacksize;
		S->stacksize += STACKINCREMENT;
	}
	*S->top=ch;
	S->top++;
	return 1;
}

int Pop(SqStack *S,StkType *ch)
{
	if(S->top == S->base)
		return 0;
	--S->top;
	*ch=*S->top;
	return 1;
}
然后是数制转换程序:NumConvert.c

#include <stdio.h>
#define StkType int

typedef struct {
	StkType *base;
	StkType *top;
	int stacksize;
}SqStack;

char Toletter(int N)
{
	switch(N)
	{
		case 0:return '0';break;	
		case 1:return '1';break;
		case 2:return '2';break;
		case 3:return '3';break;	
		case 4:return '4';break;
		case 5:return '5';break;
		case 6:return '6';break;	
		case 7:return '7';break;
		case 8:return '8';break;
		case 9:return '9';break;
		case 10:return 'a';break;	
		case 11:return 'b';break;
		case 12:return 'c';break;
		case 13:return 'd';break;	
		case 14:return 'e';break;
		case 15:return 'f';break;
		case 16:return 'g';break;	
		case 17:return 'h';break;
		case 18:return 'i';break;
		case 19:return 'j';break;	
		case 20:return 'k';break;
		case 21:return 'l';break;
		case 22:return 'm';break;	
		case 23:return 'n';break;
		case 24:return 'o';break;
		case 25:return 'p';break;	
		case 26:return 'q';break;
		case 27:return 'r';break;
		case 28:return 's';break;	
		case 29:return 't';break;
		case 30:return 'u';break;
		case 31:return 'v';break;	
		case 32:return 'w';break;
		case 33:return 'x';break;
		case 34:return 'y';break;	
		case 35:return 'z';break;
		case 36:return 'A';break;
		case 37:return 'B';break;	
		case 38:return 'C';break;
		case 39:return 'D';break;
		case 40:return 'E';break;	
		case 41:return 'F';break;
		case 42:return 'G';break;
		case 43:return 'H';break;	
		case 44:return 'I';break;
		case 45:return 'J';break;
		case 46:return 'K';break;	
		case 47:return 'L';break;
		case 48:return 'M';break;
		case 49:return 'N';break;	
		case 50:return 'O';break;
		case 51:return 'P';break;
		case 52:return 'Q';break;	
		case 53:return 'R';break;
		case 54:return 'S';break;
		case 55:return 'T';break;	
		case 56:return 'U';break;
		case 57:return 'V';break;
		case 58:return 'W';break;	
		case 59:return 'X';break;
		case 60:return 'Y';break;
		case 61:return 'Z';break;	
		case 62:return '#';break;
		case 63:return '*';break;
	}	
	return -1;
}

int main()
{
	SqStack S;
	int Dnum,Xnum,res,i=0;
	InitStack(&S);
	printf("what's the number you want to convert:\n");
	scanf("%d",&Dnum);
	printf("you want to convert %d to what scale:\n",Dnum);
	scanf("%d",&Xnum);
	
	while(Dnum)
		{
			if(!Push(&S,Dnum % Xnum))
				{
					printf("push error\n");
					return 0;
				}
			Dnum = Dnum/Xnum;
		}
	printf("The result is:");
	while(Pop(&S,&res))
			printf("%c",Toletter(res));
	printf("\n");
	return 1;
}


在linux下编译:gcc -o NumConvert NumConvert.c stack.c

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值