精华内容
下载资源
问答
  • 利用栈实现二进制数转化八进制数 #include “stdio.h” #include “stdlib.h” #include “math.h” #define OK 1 #define ERROR 0 #define STACK_INIT_DATA 20 #define STACKINCREMENT 10 typedef char ...

    利用栈实现二进制数转化成八进制数

    #include "stdio.h"
    #include "stdlib.h"
    #include "math.h"
    
    #define OK     1
    #define ERROR  0
    #define STACK_INIT_DATA 20//初始栈的大小
    #define STACKINCREMENT 10//动态扩增栈的大小
    
    typedef char Elemtype;
    typedef int Status;
    typedef struct{
     	Elemtype *top;
     	Elemtype *base;
    	int stackSize;
    }sqStack;//栈的基本结构
    
    void InitStack(sqStack *s){
    	s->base=(Elemtype*)malloc(STACK_INIT_DATA*sizeof(sqStack));//申请栈的初始空间
    	if(!s->base)//无空间分配给栈
     		exit(0);
    	s->top=s->base;
    	s->stackSize=STACK_INIT_DATA;
    }
    
    void Push(sqStack *s,Elemtype e){//入栈函数
    	if(s->top-s->base>=s->stackSize){//判断栈是否已满
    		s->base=(Elemtype*)realloc(s->base,(s->stackSize+STACKINCREMENT)*sizeof(sqStack));//为栈申请动态扩展空间
    	if(!s->base)//申请失败
     		exit (0);
    	s->top=s->base+s->stackSize;
    	s->stackSize+=STACKINCREMENT;
    	 }
    	*(s->top)=e;
    	s->top++;
    }
    
    void Pop(sqStack *s,Elemtype *e){//出栈函数
    	if(s->top==s->base)//判断是否为空栈
    		return;
    	s->top--;
    	*e=*(s->top);
    }
    
    int StackLen(sqStack s){//计算栈的长度
     	return (s.top-s.base);
    }
    
    void main(){
    	Elemtype c,sum=0;
    	sqStack s,l;
    	int len,i,j;
    	InitStack(&s);
    	InitStack(&l);
    	printf("请输入二进制数,输入#表示结束!\n");
    	scanf("%c",&c);
    	while(c!='#'){
    		Push(&s,c);
    		scanf("%c",&c);
    	 }
    	len=StackLen(s);
      	getchar();
    	for(i=0;i<len;i+=3){ //以下为将二进制转换成八进制主干
    		if(s.top-s.base>=3){
      	 		for(j=0;j<3;j++){
      	 			Pop(&s,&c);
      	 			sum+=(c-48)*pow(2,j);
    			   }
    			 Push(&l,sum+48);
    	 		 sum=0;
    		  }
    	 	 else{
      	 		for(j=0;(s.top-s.base)!=0;j++){
       	 		Pop(&s,&c);
       			sum+=(c-48)*pow(2,j);
     			}
     	 	Push(&l,sum+48);
    	 	sum=0;
    	 	}
    	}
    	printf("转化后的八进制的数是:");
    	len=StackLen(l);
    	for(i=0;i<len;i++){
    		Pop(&l,&c);
    	 	printf("%c",c);
    	}
    	printf("\n");
    }
    
    展开全文
  • 对于刚开始学习C语言的来说,我们知道%d可以表示十进制的,%o可以表示八进制,%x用来表示十六进制的,但却没有来表示二进制数的。 这就是相对应的八进制数和十六进制#include &lt;stdio.h&gt; ...

        对于刚开始学习C语言的来说,我们知道%d可以表示十进制的数,%o可以表示八进制的数,%x用来表示十六进制的数,但却没有来表示二进制数的。

        这就是相对应的八进制数和十六进制数

    #include <stdio.h>
    int main()
    {
    	int n;
    	printf("请输入一个十进制的整数:\n");
    	scanf("%d",&n);
    	printf("八进制数为:%o\n",n);
    	printf("十六进制数为:%x\n",n); 
    	return 0;
    } 


        那么如何输入一个相对应的二进制数尼?我们知道,对于一个二进制数,只有0和1;一个十进制数转化为二进制数,就是不断模2,并且最后将模2的结果逆序输出。

        下面的代码比较容易理解,但特别的繁琐。

    #include <stdio.h>
    #define Maxsize 100
    int main()
    {
    	int n=0,count=0,j=0;
    	int a[Maxsize],b[Maxsize];
    	printf("请输入一个十进制整数:\n");
    	scanf("%d",&n);
    	if(n>=0){
    		while(n!=0){
    			a[count]=n%2;
    			n=n/2;
    			count++;
    		}
    		for(int i=count-1;i>=0;i--)//将数组逆序输出 
    		printf("%d",a[i]);
    	}
    	else{
    		n=-n;
    		while(n!=0){
    			a[count]=n%2;
    			n=n/2;
    			count++;
    		}
    		for(int i=count-1;i>=0;i--){//将逆序输出的结果保存在另一个数组中 
    			b[j]=a[i];
    			j++;
    		}
    		for(int i=0;i<count;i++){   //取反码 
    			if(b[i]==0)
    				b[i]=1;
    			else
    				b[i]=0;
    		}
    		for(int i=count-1;i>=0;i--){  //将反码加1 
    			if(b[i]==0){
    				b[i]=1;
    				break;
    			}		
    			else{
    				b[i]=0;
    			}
    		}
    		for(int i=0;i<count;i++)
    		printf("%d",b[i]);
    	}
    	printf("\n");
    	return 0;
    }


    下面的代码比较简单,但不太容易理解。
    #include <stdio.h>
    int main()
    {
    	int n;
    	printf("请输入一个十进制数:\n");
    	scanf("%d", &n);
    	unsigned int i = 1u << 15;
    	for ( ; i ; i >>= 1) {
    		printf("%d",n&i?1:0);
    	}
    	printf("\n");
    	return 0;
    }


        上述代码用的是移位,用这个方法,代码中的i必须用unsigned int 无符号整型来表示,初始化i=1,后面的u表示的就是unsigned,<<15表示向左移位15个bit(本代码输出的是十六位的二进制数,如果想输出32位的二进制数,只需将15变为31即可),将0000000000000001中的1向左移位15就得到了1000000000000000,接下来就是for循环,就是单纯的让1慢慢向后移一位,例如第二次循环就变为了0100000000000000,同理下去。&表示的是按位与运算符。

        举一个简单的例子,八位的二进制数,假设i循环为了00100000,而算求的二进制数为xx1xxxxx,我们只看与i 中的1相对应位置的数字,假设为0,则最后结果二进制数的该位就是0,若为1,最后结果二进制数的该位就为1,不需要去考虑其他的位置。注意,该方法加入输入一个负数,前面某几位会是。

        上述的代码都只适用于整数。

    展开全文
  • 挑战面试编程:十六进制数转化为八进制数 题目: 问题描述  给定n个十六进制正整数,输出它们对应的八进制数。 输入格式  输入的第一行为一个正整数n (1)。  接下来n行,每行一个由0~9、大写字母A~F组成的字符...

                      挑战面试编程:十六进制数转化为八进制数

    题目

    问题描述

      给定n个十六进制正整数,输出它们对应的八进制数。
    输入格式
      输入的第一行为一个正整数n (1<=n<=10)。
      接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
    输出格式
      输出n行,每行为输入对应的八进制正整数。
    注意
      输入的十六进制数不会有前导0,比如012A。
      输出的八进制数也不能有前导0。
    样例输入
    2
    39
    123ABC
    样例输出
    71
    4435274
    提示
      先将十六进制数转换成某进制数,再由某进制数转换成八进制。
    */


    想法

    先把16进制数转为2进制数,再把2进制数转为8进制数。


    算法演示

    我们对十六进制数39转化八进制演示,括号内指示进制

    39(16)

    0011 1001(2) 转二进制,一位转四位

    000 111 001(2) 从右至左,每三位一组合,不足的补0

    071(8) 转八进制,三位转一位


    难点分析

    1.明显的大数运算,为了防止溢出,用字符串来处理。那么需要为每个16进制数分配多少字节存储呢?

    分析:由于题目限定十六进制数是10W位以内的。16进制转2进制,一位转四位,那就是4*10W=40W位。再考虑到,每三位一组合,40W % 3 = 1,也就是需要补两个0,那么需要40W + 2 = 400002位,加上最后的字符串结束符'\0',一共需要400003位。

    结论:为每个16进制数分配400003个字节即可。

    2.为了方便进制之间的转换,我们提前制作两张表。

    table1[i]   1位16进制数i,对应的四位2进制数table1[i]

    table2[i]   3位2进制数table2[i],对应的一位8进制数i

    3.需要处理前导0的情况,具体解决看代码。


    代码:

    #include <stdio.h>
    #include <string.h>
    /*
    给定n个十六进制正整数,输出它们对应的八进制数。
    */
    char *table1[16] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111",
    "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };
    char *table2[8] = { "000", "001", "010", "011", "100", "101", "110", "111" };
    //转二进制,一位转四位
    void toBinary(char **nums, int n)
    {
    	int len, i, j, k, pos;
    	for (i = 0; i < n; i++)
    	{
    		len = strlen(nums[i]);
    		j = 399998;
    		for (k = len - 1; k >= 0; k--)
    		{
    			if (nums[i][k] >= 'A' && nums[i][k] <= 'F')
    				pos = nums[i][k] - 'A' + 10;
    			else
    				pos = nums[i][k] - '0';
    			strncpy(nums[i] + j, table1[pos], 4);
    			j -= 4;
    		}
    		j += 4;
    
    		memset(nums[i], '0', j);
    	}
    }
    //转八进制,三位转一位
    void toOctal(char **nums, int n)
    {
    	int i, j, k, r, s;
    	for (i = 0; i < n; i++)
    	{
    		j = 0;
    		k = 399999;
    		while (nums[i][j] == '0')
    			j++;
    
    		s = 400001;
    		while (k >= j - 3)
    		{
    			for (r = 0; r < 8; r++)
    			{
    				if (strncmp(nums[i] + k, table2[r], 3) == 0)
    				{
    					nums[i][s--] = r + '0';
    					break;
    				}
    			}
    			k -= 3;
    		}
    		s++;
    		while (nums[i][s] == '0') //跳过前导'0'
    			s++;
    		//打印
    		puts(nums[i] + s);
    	}
    }
    int main(void)
    {
    	//读入数据
    	int n;
    	scanf("%d", &n);
    
    	char **nums = malloc(sizeof(char*)*n);
    	int i;
    	for (i = 0; i < n; i++)
    	{
    		nums[i] = malloc(sizeof(char) * 400003);
    		memset(nums[i], 0, 400003);
    		scanf("%s", nums[i]);
    	}
    
    	//先转二进制
    	toBinary(nums, n);
    
    	//再转八进制
    	toOctal(nums, n);
    
    	//释放内存
    	for (i = 0; i < n; i++)
    		free(nums[i]);
    	free(nums);
    
    	return 0;
    }
    运行


    代码下载:十六进制数转化为八进制数



    所有内容的目录

    展开全文
  • 用汇编实现十六进制数转化为八进制数,可用除法或是移位。 ;课堂作业 ;十六进制转八进制 DATA SEGMENT NUM1 DB 08H NUM2 DB 40H NUM3 DB 48H DATA ENDS STACK SEGMENT PARA STACK BUF DW 20H DUP ...

    用汇编实现十六进制数转化为八进制数,可用除法或是移位。

    ;课堂作业
    ;十六进制转八进制
    DATA SEGMENT
      NUM1 DB 08H
      NUM2 DB 40H
      NUM3 DB 48H
    DATA ENDS   
    
    STACK SEGMENT PARA  STACK
      BUF DW 20H DUP (0)
      LEN EQU $-BUF
    STACK ENDS
    
    CODESEG SEGMENT
    ASSUME CS:CODESEG,SS:STACK,DS:DATA
    START:
    ;初始化堆栈段ss和数据段ds
      MOV AX,STACK
      MOV SS,AX
      MOV SP,LEN
      MOV AX,DATA
      MOV DS,AX
      
        MOV AH,0
        MOV AL,NUM2        ;MOV AL,NUM1
        MOV DL,08H
        DIV DL    ;余数保存在AH,商保存在AL中
        
        CALL DISP_1_HEX
        MOV AL,AH
        CALL DISP_1_HEX
        CALL DISP_CREF
        
        MOV AH,4CH
        INT 21H
    
    
    ;输出AL的数字和字母
    DISP_1_HEX:  
      PUSH AX
      PUSH DX
      PUSHF
      MOV DL,AL
      CMP DL,09
      JBE L_1  ;小于等于9则跳过下一条语句
      ADD DL,27H ;大于10则转换为小写字母并执行到下面的L_1的RET结束
                    ;数字10与字符a差为39(27H)
    ;数字输出(1的ascii码为31H)
    L_1:  
      ADD DL,30H ;数字转换为字符
      MOV AH,02H
      INT 21H
      POPF
      POP DX
      POP AX 
    RET
    
    ;输出回车换行
    DISP_CREF: 
     PUSH DX
     PUSH AX
     MOV AH,02H
     MOV DL,0DH
     INT 21H
     MOV DL,0AH
     INT 21H
     POP AX
     POP DX
    RET
    
    CODESEG ENDS
    END START

    输出结果为对应的八进制

    转载于:https://www.cnblogs.com/jdemarryme/p/9071585.html

    展开全文
  • 1.十进制转化为二进制数 十进制15 上图中箭头的方向即为二进制数中从低位到高位(从右往左)的顺序, 二进制数为:0000 0000 0000 0000 0000 0000 0000 1111 2.十进制转化为八进制数 十进制:15 与...
  • 提示:一个的进制有很多种,比如二进制八进制,十进制,十六进制等。 1、 周一至周五晚上 7 点—晚上9点 2、 周六上午 9 点-上午 11 点 3、 周日下午 3 点-下午 6 点 学习产出: 提示:这里统计学习计划的总量 ...
  • java将二进制数转化为十进制

    千次阅读 2016-12-04 17:40:49
    import java.util.Scanner;   public class Test {  public static void main(String[] args) {  Scanner sc = new Scanner(System.in);...输入一个二进制数: ");  String...
  • C语言算法之将十进制转换成二进制数

    万次阅读 多人点赞 2018-06-20 14:35:29
    导语:在C语言中没有将其他进制的直接输出为二进制数的工具或方法,输出为八进制数可以用%o,输出十六进制可以用%x,输出为二进制就要我们自行解决了。下面给大家讲述一下如何编程实现将十进制转换成二进制数...
  • 二进制的1101转化成十进制 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 转化成十进制要从右到左用二进制的每个去乘以2的相应次方 不过次方要从0开始十进制转二进制: 用2辗转相除至结果1 将余数和最后的1...
  • 说明: ...把一个带小数的十进制数转化为R进制输出,R可为二进制八进制或十六进制,从键盘输入 分析:带小数的十进制,对于整数来说,进制间的转化大家都不陌生。十进制整数到二进制整数的...
  • 十进制转换为二进制并输出,本文仅讨论整数部分  方法:除2取余法,即每次将整数部分除以2,余数该位权上的,而商继续除以2,余数又上一个位权上的,这个步骤一 直持续下去,直到商为0为止;最后读时候...
  • 基于栈二进制转化为八进制

    千次阅读 2015-08-25 17:16:07
    基于栈二进制数转化为八进制数的代码如下 #include #include # include # include #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base;//栈...
  • 1.二进制八进制数转化方法相同,对n不断取余(直至n0)放入数组,再逆向输出。 2.十六进制取余所得需要改成十六进制表示方法,放入数组后再逆向输出。 #include <stdio.h> #include <stdlib.h> ...
  • 2、bin(num):将num转化为二进制数;oct(num): 将num转化为八进制数;hex(num): 将num转化为十六进制。(下示例代码,以直接调用此函数作为对照)。3、str(ret) 返回ret的字符串形式。4、ord()函数作用:以一个...
  • 问题:实现八进制转化 二进制 十进制 十六进制。 代码如下: #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;math.h&amp;gt; #define max 100...
  • 以十进制的“19”转换为二进制数为例,用19除以模(在这里模就是2)然后取它的余数。 19除以2商9余1 9除以2商4余1 4除以2商2余0 2除以2商1余0 1除以2商0余1 当商为0时结束运算 所以19的二进制为11001
  • 把任意一个十进制转换为二进制八进制十六进制的c++源代码
  • 比如一个二进制数转化为十进位?以下文字资料是由(历史新知网www.lishixinzhi.com)小编大家搜集整理后发布的内容,让我们赶快一起来看一下吧!用windows自带的计算器怎么算进制转换?比如一个二进制数转化为十...
  • #include<stdio.h> #include<stdlib.h> const int MAX_SIZE=1e5+10; typedef struct SNode{ struct SNode *next; int data; }Stack; Stack* creatStack(){ Stack *head;...data=0
  • 十进制小数转化为二进制小数

    千次阅读 2019-03-04 15:01:19
    一、二进制数转换成十进制二进制数转换成十进制的基本做法是,把二进制数首先...十进制转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制的整数部分和小数部分分别转换后,再加以合并。...
  • 二进制转换为八进制方法:1、取三合一法,即从二进制的小数点分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的就是一位八位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的...
  • kotlin 二进制Given a number in octal number system format, we have to convert it into... 给定八进制系统格式的数字,我们必须将其转换为二进制数系统格式。 Example: 例: Input: num = 123 Output:...
  • 问题一:实现十六进制转化二进制以及十进制; 实验代码如下: #include &amp;amp;lt;stdio.h&amp;amp;gt; #include &amp;amp;lt;stdlib.h&amp;amp;gt; #include &amp;amp;lt;string.h&...
  • 该资源是用于将十进制转换为八进制数的程序,编程语言c#,程序简单易懂,便于实用。
  • 二进制八进制:把二进制每三个位分一等份,从右边开始分。计算三个二进制数的和就是八进制数中的一位。 如下: 101110111001转成八进制:从右边开始分。 101 110 111 001三位二进制相加得到的结果: 5 6 ...
  • 对于基础薄弱的读者,本节的内容可能略显晦涩和枯燥,如果觉得吃力,可以暂时跳过,用到的时候再来...将二进制八进制、十六进制转换十进制二进制八进制和十六进制向十进制转换都非常容易,就是“按权相加”。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,746
精华内容 19,098
关键字:

二进制数转化为八进制