数据结构-栈的运用-数的进制转换

对于进制转换,其实是具有以下最初的思想

1-输入某一个十进制的数值

2-选择你所要进行的进制转换类型

3-将这个数的来进求余进制数并保留在数组中

4-将十进制的数字除以进制数

5-这是一个循环,直至该数小于零则结束

6-然后再让数组进行反向输出就能得到你所要转换的二进制

do{

a[count++]=x%p;

x=x/p;

}while(x!=0);

#include <stdio.h>
int main(){
	int x,p; //x为十进制数,p为目标进制大小 
	scanf("%d",&x);
	scanf("%d",&p);
	int a[100]; //存放余数 
	int count=0;
	do{
		a[count++]=x%p;
		x=x/p;
	}while(x!=0);//当商不为0时进行循环 
	
	for(int i=count-1;i>=0;i--){
		printf("%d",a[i]);
	}
} 

方法二 (其实原理是一样的,一样是求基取余)

#include<stdio.h>
int main(){
	int A,B,sum,i=0,radix,c[31];
	scanf("%d %d %d",&A,&B,&radix);
	sum=A+B;
	if(sum==0)//考虑两者相加为0的情况。 
		printf("0");
	while(sum>0){
		c[i++]=sum%radix;  //十进制转其他进制,用除基取余法
		sum/=radix;   //(不断用商除以基数,然后倒序排列余数)
	}
	for(--i;i>=0;i--)
		printf("%d",c[i]);	
	return 0;
}

 方法三(传统的做法)

分析:这个做法的原理是去定义一个空的数组,以及定义一个函数,然后当你把所有的十进制二进制都输入完之后开始去调用函数,然后进入函数第一件事情是进行判断,如果你是0,哪个直接被覆盖掉,如果不是继续往下走,然后就用到递归,多次调用,直至再次传入这个函数中的数值为0然后进行返回。

在此涉及到以下的函数

这些函数的头文件是#include <string.h>

strlen :计算字符串的长度,作用类似于sizeof

strcpy:这个函数是可以用后续的将(s,"")的后覆盖前。

convto(s, n / b, b);  //递归函数
    len = strlen(s);  //计算字符串的长度
    s[len] = bit[n % b]; //求余
    s[len + 1] = '\0'; //因为字符串的结尾要是空

#include <stdio.h>
#include <string.h>
void convto(char* s, int n, int b);
int main(void) {
	char s[80]; //数组
	int  base, old;
	printf("请输入十进制数:");
	scanf("%d", &old);
	printf("请输入转换的进制:");
	scanf("%d", &base);
	convto(s, old, base);
	printf("%s\n", s);
	getchar();
	return 0;
}
void convto(char* s, int n, int b) {
	char bit[] = { "0123456789ABCDEF" };
	int len;
	if (n == 0) {
		strcpy(s, ""); //这个是用空覆盖
		return;
	}
	convto(s, n / b, b);
	len = strlen(s);
	s[len] = bit[n % b];
	s[len + 1] = '\0';
}

第四种方法:数据结构栈来进行进制转化

看着是很复杂吧,但是对于栈的构建完成后这个其实是不复杂的。

如果不了解栈,那么就去我的另一篇文章了解一下吧

 栈的初步了解及其运用icon-default.png?t=M85Bhttps://blog.csdn.net/m0_61196970/article/details/125859630?spm=1001.2014.3001.5502

那么对于这个进制的转换 其实核心也是这个

就是当你传入的N然后来进行求余,之后你去判断它是否为空,但是这些的判断都是基于函数上的判断的,同时在栈中进行的。

void  conversion(int N, int d) {
   // int c;
    SeqStack s;
    Elemtype t;
    Init_SeqStack(&s);
    while (N) {
        Push_SeqStack(&s, N % d);
        N = N / d;
    }
    while (!Empty_SeqStack(&s)) {
        Pop_SeqStack(&s, &t);
        printf("%d",t);
    }

}

代码如下 

#include<stdio.h>
#define MAXSIZE 30
typedef int Elemtype;
typedef struct {
    Elemtype data[MAXSIZE];
    int top;
}SeqStack;
SeqStack* s;
void Init_SeqStack(SeqStack* s) {

    s->top = -1;
}
int Empty_SeqStack(SeqStack* s) {
    if (s->top == -1)
        return 1;
    else
        return 0;
}
void Push_SeqStack(SeqStack* s, Elemtype t) {
    if (s->top == MAXSIZE - 1);
    else{
    s->top++;
    s->data[s->top] = t;
    }
}
void Pop_SeqStack(SeqStack* s, Elemtype* t) {
    *t = s->data[s->top];
    s->top--;
}
void pananl()
{
    puts("选择以下操作\t");
    printf("\t 1:转换后的二进制:\t\n");
    printf("\t 2:转换后的四进制:\n");
    printf("\t 3:转换后的八进制:\n");
    printf("\t 4:转换后的十六进制:\n");
    printf("\t 5:转换后的三十二进制:\n");
    printf("\t 6:转换后的六十四进制:\n");
    printf("\t 7:输出所有进制:\n");
}
void  conversion(int N, int d) {
   // int c;
    SeqStack s;
    Elemtype t;
    Init_SeqStack(&s);
    while (N) {
        Push_SeqStack(&s, N % d);
        N = N / d;
    }
    while (!Empty_SeqStack(&s)) {
        Pop_SeqStack(&s, &t);
        printf("%d",t);
    }

}
int main() {
    int n, d,i,j=2;
    printf("请输入十进制N的值:");
    scanf("%d", &n);
    pananl(); //这是哪个屏幕
    printf("请输入你的选择:");
    scanf("%d", &d);
    switch (d) {
    case 1:printf("%d的%d的进制是:",n,2);
          conversion(n, 2); break;
    case 2:printf("%d的%d的进制是:", n, 4);
        conversion(n, 4); break;
    case 3: printf("%d的%d的进制是:", n, 8);
        conversion(n, 8); break;
    case 4:printf("%d的%d的进制是:", n, 16);
        conversion(n, 16); break;
    case 5:printf("%d的%d的进制是:", n, 32);
        conversion(n, 32); break;
    case 6:printf("%d的%d的进制是:", n, 66);
        conversion(n, 64); break;
    case 7: printf("%d的2 4 8 16 32 64进制是分别是:\n", n);
        for(i=1;i<=6;i++){
            conversion(n, j);
            j = j * 2;
            printf("  ");
            if (i == 6) break;
        }

    }

    return 0;
}

这是我的一个小的想法,其中第一段的代码引用了另外一个靓仔

以上便是我的分享的了,如果够更好地想法欢迎在下边评论留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i-阿松!

请给我一毛钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值