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


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

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

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

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

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

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

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

    do{

    a[count++]=x%p;

    x=x/p;

    }while(x!=0);

    1. #include
    2. int main(){
    3. int x,p; //x为十进制数,p为目标进制大小
    4. scanf("%d",&x);
    5. scanf("%d",&p);
    6. int a[100]; //存放余数
    7. int count=0;
    8. do{
    9. a[count++]=x%p;
    10. x=x/p;
    11. }while(x!=0);//当商不为0时进行循环
    12. for(int i=count-1;i>=0;i--){
    13. printf("%d",a[i]);
    14. }
    15. }

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

    1. #include
    2. int main(){
    3. int A,B,sum,i=0,radix,c[31];
    4. scanf("%d %d %d",&A,&B,&radix);
    5. sum=A+B;
    6. if(sum==0)//考虑两者相加为0的情况。
    7. printf("0");
    8. while(sum>0){
    9. c[i++]=sum%radix; //十进制转其他进制,用除基取余法
    10. sum/=radix; //(不断用商除以基数,然后倒序排列余数)
    11. }
    12. for(--i;i>=0;i--)
    13. printf("%d",c[i]);
    14. return 0;
    15. }

     方法三(传统的做法)

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

    在此涉及到以下的函数

    这些函数的头文件是#include

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

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

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

    1. #include
    2. #include
    3. void convto(char* s, int n, int b);
    4. int main(void) {
    5. char s[80]; //数组
    6. int base, old;
    7. printf("请输入十进制数:");
    8. scanf("%d", &old);
    9. printf("请输入转换的进制:");
    10. scanf("%d", &base);
    11. convto(s, old, base);
    12. printf("%s\n", s);
    13. getchar();
    14. return 0;
    15. }
    16. void convto(char* s, int n, int b) {
    17. char bit[] = { "0123456789ABCDEF" };
    18. int len;
    19. if (n == 0) {
    20. strcpy(s, ""); //这个是用空覆盖
    21. return;
    22. }
    23. convto(s, n / b, b);
    24. len = strlen(s);
    25. s[len] = bit[n % b];
    26. s[len + 1] = '\0';
    27. }

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

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

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

     栈的初步了解及其运用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);
        }

    }

    代码如下 

    1. #include
    2. #define MAXSIZE 30
    3. typedef int Elemtype;
    4. typedef struct {
    5. Elemtype data[MAXSIZE];
    6. int top;
    7. }SeqStack;
    8. SeqStack* s;
    9. void Init_SeqStack(SeqStack* s) {
    10. s->top = -1;
    11. }
    12. int Empty_SeqStack(SeqStack* s) {
    13. if (s->top == -1)
    14. return 1;
    15. else
    16. return 0;
    17. }
    18. void Push_SeqStack(SeqStack* s, Elemtype t) {
    19. if (s->top == MAXSIZE - 1);
    20. else{
    21. s->top++;
    22. s->data[s->top] = t;
    23. }
    24. }
    25. void Pop_SeqStack(SeqStack* s, Elemtype* t) {
    26. *t = s->data[s->top];
    27. s->top--;
    28. }
    29. void pananl()
    30. {
    31. puts("选择以下操作\t");
    32. printf("\t 1:转换后的二进制:\t\n");
    33. printf("\t 2:转换后的四进制:\n");
    34. printf("\t 3:转换后的八进制:\n");
    35. printf("\t 4:转换后的十六进制:\n");
    36. printf("\t 5:转换后的三十二进制:\n");
    37. printf("\t 6:转换后的六十四进制:\n");
    38. printf("\t 7:输出所有进制:\n");
    39. }
    40. void conversion(int N, int d) {
    41. // int c;
    42. SeqStack s;
    43. Elemtype t;
    44. Init_SeqStack(&s);
    45. while (N) {
    46. Push_SeqStack(&s, N % d);
    47. N = N / d;
    48. }
    49. while (!Empty_SeqStack(&s)) {
    50. Pop_SeqStack(&s, &t);
    51. printf("%d",t);
    52. }
    53. }
    54. int main() {
    55. int n, d,i,j=2;
    56. printf("请输入十进制N的值:");
    57. scanf("%d", &n);
    58. pananl(); //这是哪个屏幕
    59. printf("请输入你的选择:");
    60. scanf("%d", &d);
    61. switch (d) {
    62. case 1:printf("%d的%d的进制是:",n,2);
    63. conversion(n, 2); break;
    64. case 2:printf("%d的%d的进制是:", n, 4);
    65. conversion(n, 4); break;
    66. case 3: printf("%d的%d的进制是:", n, 8);
    67. conversion(n, 8); break;
    68. case 4:printf("%d的%d的进制是:", n, 16);
    69. conversion(n, 16); break;
    70. case 5:printf("%d的%d的进制是:", n, 32);
    71. conversion(n, 32); break;
    72. case 6:printf("%d的%d的进制是:", n, 66);
    73. conversion(n, 64); break;
    74. case 7: printf("%d的2 4 8 16 32 64进制是分别是:\n", n);
    75. for(i=1;i<=6;i++){
    76. conversion(n, j);
    77. j = j * 2;
    78. printf(" ");
    79. if (i == 6) break;
    80. }
    81. }
    82. return 0;
    83. }

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

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

  • 相关阅读:
    golang获取时区报错的问题
    easypoi-通过反射动态修改表格抬头
    已解决ValueError: If using all scalar values, you must pass an index
    【UE 材质】制作加载图案(2)
    软件测试1
    基于Java毕业设计信贷管理系统源码+系统+mysql+lw文档+部署软件
    爱上开源之golang入门至实战第四章函数(Func)(十)
    【JAVASE开发】带你零基础学JAVA项目(学生管理系统篇)
    机器学习实战:回归
    落户中国云都,智算中心挑起区域发展的大梁
  • 原文地址:https://blog.csdn.net/m0_61196970/article/details/127743261