LQ BASIC-10 十进制转十六进制

问题描述

  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。

输入格式

  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647

输出格式

  输出这个整数的16进制表示

样例输入

30

样例输出

1E

解题思路

采用经典的循环取余算法,用一个数组_16t代替栈,在“压栈”完成后,使用for循环倒序将_16t中元素存入数组_16

第一次提交只有90分,明显有一个测试点不对,随后进行边界测试,输入2147483647可以正确输出,但是输入0没有输出,发现算法存在问题,如果输入是0,虽然_16t中被压入了0,但是Length的值没有改变,为0,所以在转入_16数组时没有进行操作。随后修改代码

本来是想强行添加

    //为0判断 
    if( _10 == 0 )
    {
        _16[0] = '0';
        _16[1] = '\0';
        return;
    }*

后来还是规范了一下

源代码

#include <stdio.h>

void _10to16( int _10, char _16[] );

int main()
{
    int  _10;
    char _16[10];

    scanf( "%d", &_10 );
    _10to16( _10, _16 );
    printf("%s", _16);

    return 0;
} 

//辗转求余法 
void _10to16( int _10, char _16[] )
{
    int i = 0;
    int Temp = 0;
    int Length = 0;
    char _16t[10];

    while( _10 / 16 != 0 )
    {
        Temp = _10 % 16;

        if( Temp >= 0 && Temp <= 9 )
        {
            _16t[ Length++ ] = Temp + '0';
        }
        else if( Temp >= 10 && Temp <=15 )
        {
            _16t[ Length++ ] = ( Temp - 10 ) + 'A';
        }
        else
        {
            ;
        }

        _10 = _10 / 16;

    }

    //最后一次“入栈” 
    //之前这里的Length没有++导致0不能输出 
    if( _10 < 10 )
        _16t[ Length++ ] = _10 + '0';
    else
        _16t[ Length++ ] = _10 - 10 + 'A';

    for( i = 0; i <= Length ; i++ )
    {
        _16[i] = _16t[ Length - i - 1 ];
    }

}
    原文作者:进制转换
    原文地址: https://blog.csdn.net/mading0613/article/details/54707037
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞