C语言每日练习之进制转换

目录
  • 分析
  • 代码实现
  • 网上参考
  • 总结

分析

我一开始的想法是通过输入整数形式八进制来转换成十进制输出,后来发现用字符数组输入更方便。我这里就讲讲我用整型数据输入的转换思路:

我们都知道二进制由0和1组成,3位二进制组成在一起,就可以表示0-7这八个数,所以八进制实际上就是3位二进制的组合(同理十六进制是4位二进制的组合),C语言的位运算操作的是二进制,算术运算针对的是十进制,所以,我们可以通过位运算求出八进制的每一位数(3位二进制为1位),然后通过算术运算符+,将他们加起来。和十进制运算不同的地方在于一个两位的十进制数的十位数要乘10加上个位数即一个两位十进制数,而八进制的两位数,高位只需要乘以8。

这题我们也可以偷个懒,让C编译器帮我们算,只需要三行即可实现转换:

int octal_num = 0;
scanf("%o", &octal_num);
printf("十进制:%d\n", octal_num);

当然,不建议这样做。

至于用字符数组形式输入,那就更简单了,不用通过位运算取出八进制数每位数,具体实现见网上参考部分。

代码实现

#include <stdio.h>
/**
 * @brief 八进制转十进制
 * @param octal_number 八进制数
 * @return 十进制数
 */
int Octal_to_Decimal(int octal_number)
{
    int dec_number = 0;       //十进制返回值
    int negative = 0;         //负数标志
    if(octal_number < 0)      //负数判断
    {
        octal_number = -1 * octal_number;
        negative = 1;
    }
    while(octal_number != 0)
    {
        //高位之和乘8再加上低3位,低3位即八进制最低位
        dec_number = dec_number * 8 + (octal_number & 0x7) ;
        octal_number >>= 3;    //右移3位
    }
    if(negative)
        return -1 * dec_number;
    return dec_number;
}
#define FIRST  //使用第一种方法,注释掉此行则使用第二种方法
int main()
{
    int octal_num = 0;
#ifdef FIRST
    printf("输入一个八进制数\n");
    scanf("%o", &octal_num);
    printf("对应的十进制为%d\n", Octal_to_Decimal(octal_num));

#else
    /* 偷懒法 */
    puts("八进制:");
    scanf("%o", &octal_num);
    printf("十进制:%d\n", octal_num);
#endif
    return 0;
}

运行结果

网上参考

//  Created by www.runoob.com on 15/11/9.
//  Copyright © 2015年 菜鸟教程. All rights reserved.
//   https://www.runoob.com/cprogramming/c-exercise-example82.html
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n=0,i=0;
    char s[20];
    printf("请输入一个8进制数:\n");
    gets(s);
    while(s[i]!='\0'){
        n=n*8+s[i]-'0';
        i++;
    }
    printf("刚输入的8进制数转化为十进制为\n%d\n",n);
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言中网络地址与二进制数之间转换的函数小结

    C语言inet_ntoa()函数:将网络二进制的数字转换成网络地址 头文件: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> 定义函数: char * inet_ntoa(struct in_addr in); 函数说明:inet_ntoa()用来将参数in 所指的网络二进制的数字转换成网络地址, 然后将指向此网络地址字符串的指针返回. 返回值:成功则返回字符串指针, 失败则返

  • 编写C语言程序进行进制转换的问题实例

    题目 题目描述:      将M进制的数X转换为N进制的数输出.      输入:      输入的第一行包括两个整数:M和N(2<=M,N<=36).      下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出.      输出:      输出X的N进制表示的数.      样例输入:      16 10      F      样例输出:      15      提示:      输入时字母部分为大写,输出时为小写,并且有大数据. 思路 大整数乘法

  • C语言用栈实现十进制转换为二进制的方法示例

    本文实例讲述了C语言用栈实现十进制转换为二进制的方法.分享给大家供大家参考,具体如下: #include<stdio.h> #include<malloc.h> #include<math.h> #include<string.h> #include "process.h" #define SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define TRU

  • C语言的进制转换及算法实现教程

    1.其他进制转十进制 1.1.二进制转十进制 转换规程: 从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和,例如: 二进制 1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 = 1 + 2 + 0 + 8 = 11 1.2.八制转十进制 转换规则: 从最低位开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和,例如: 八进制 0123 = 3*8^0 + 2*8^1 + 1*8^2 = 3+16+64 = 83 1.3.十六进制转十进制

  • C语言实现进制转换函数的实例详解

    C语言实现进制转换函数的实例详解 前言: 写一个二进制,八进制,十六进制转换为十进制的函数 要求: 函数有两个参数,参数(1)是要转换为十进制的进制数,参数(2)是标示参数(1)是什么进制(2,8,16标示二进制,八进制,十六进制). 要有报错信息,比如参数是1012,但参数(2)是2,显然是进制数表示有错误. 系统表 pg_proc 存储关于函数的信息 内部函数在编译之前需要先定义在 pg_proc.h 中,src/include/catalog/pg_proc.h CATALOG(pg_pr

  • C语言每日练习之进制转换

    目录 分析 代码实现 网上参考 总结 分析 我一开始的想法是通过输入整数形式八进制来转换成十进制输出,后来发现用字符数组输入更方便.我这里就讲讲我用整型数据输入的转换思路: 我们都知道二进制由0和1组成,3位二进制组成在一起,就可以表示0-7这八个数,所以八进制实际上就是3位二进制的组合(同理十六进制是4位二进制的组合),C语言的位运算操作的是二进制,算术运算针对的是十进制,所以,我们可以通过位运算求出八进制的每一位数(3位二进制为1位),然后通过算术运算符+,将他们加起来.和十进制运算不同的地

  • Python和C语言利用栈分别实现进制转换

    目录 问题描述 C语言实现 Python实现 问题描述 利用栈的数据结构实现将十进制数转换成二进制数 C语言实现 顺序表的存储结构实现栈 代码: #include <stdlib.h> #include <stdio.h> #define STACK_INIT_SIZE 100 //栈初始开辟空间大小 #define STACK_INCREMENT 10 //栈追加空间大小 //栈的结构体 typedef struct stack{ int *base; int *top; int

  • php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码

    十进制转换为二进制.八进制.十六进制 从十进制向其它进制转换,用的是就用该数字不断除以要转换的进制数,读取余数.连接一起就可以了. 复制代码 代码如下: <?php /** *十进制转二进制.八进制.十六进制 不足位数前面补零* * * @param array $datalist 传入数据array(100,123,130) * @param int $bin 转换的进制可以是:2,8,16 * @return array 返回数据 array() 返回没有数据转换的格式 * @copyrig

  • Java实现的进制转换工具类完整示例

    本文实例讲述了Java实现的进制转换工具类.分享给大家供大家参考,具体如下: import java.nio.charset.Charset; /** * 十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示(其中:A~F即10~15).<br> * 例如十进制数57,在二进制写作111001,在16进制写作39.<br> * 像java,c这样的语言为了区分十六进制和十进制数值,会在十六进制数的前面加上 0x,比如0x20是十进制的

  • C# 进制转换的实现(二进制、十六进制、十进制互转)

    由于二进制数在C#中无法直接表示,所以所有二进制数都用一个字符串来表示 例如: 二进制: 1010 表示为 字符串:"1010"  int d = 10; //十进制转二进制字符串 Console.WriteLine(Convert.ToString(d,2)); //输出: 1010 //十进制转十六进制字符串 Console.WriteLine(Convert.ToString(d,16)); //输出: a //二进制字符串转十进制数 string bin = "101

  • 一篇教程教你学会Python进制转换(十进制转二进制、八进制、十六进制)

    一.导言 导语: 在计算机进行数据交换时,常常会有一个进制转换的过程,我们知道计算机只认0 和 1.在内存系统中,基本基于二进制进行运算的,但是有时候数据过于庞大,为了方便存储管理,计算机会使用十六进制存储数据,但是怎么实现数据转换呢? 我们人类由十根手指头,所以自然就使用十进制啦,每当我们数数字到10之后,于是就重0 开始继续数,所以逢十进一就这么来了. 对于其它进制呢,也是同样的,比如最常见的二进制,也就是逢二进一,慢慢来,依次类推,所以数学的世界是多么的奇妙呀! 今天给大家带来的是使用 P

  • 浅析Java进制转换、输入、命名问题

    Java进制转换和C语言C++没有什么区别,不过因为我对进制转换不太熟悉,此处特记录一下生疏部分: 十进制转二进制:除以二取余数,直到商为零,余数顺序倒过来取就是二进制表示的数值.(八进制.十六进制同理) 二进制转八进制:二进制数值三位一组计算数值. 二进制转十六进制:二进制四位一组计算数值. 八进制.十六进制转二进制 是 二进制转八进制十六进制 的逆运算. Java输入输入似乎比C/C++要复杂(?) 首先要引入包util下的Scanner,创建Scanner的一个对象,之后才可以执行输入.

  • C++面试题之进制转换的实例

    C++进制转换的实例 一个面试题,要求输入十进制数,输出十六进制,可以使用printf打印%d,%c,%s来输出,但不能使用 %x 打印. 写了两种算法,还算比较简洁,粘贴在此. // 第一种算法,从低位到高位扫描移位,需要一个数组辅助倒序,一次性输出结果 #include <stdio.h> #define MAX_HEX_NUM 16 #define OUT_DATA_LEN sizeof(int)*2 // 2个16进制数表示1个字节 static char Hex_Char_Table

随机推荐