一道笔试题:C#下十进制转十六进制

    作为电子专业的学生,我发现越来越多的同学转向软件开发方向,虽然我们专业跟软件没沾多少边。以下是我同学发给我的一道笔试题,让我周一前写完,以下是详细内容,权当做学习一下吧。

笔试题

    题干

    选择一门熟悉的语言,请用此语言编写如下函数, 采用自己的算法,不要使用 printf, sprintf, Format, toString, itoa, toHex,等函数。

    函数名称

     TQ_GetHexStringEx

    参数

    整数 iNumber
    整数 iCount

    返回值

    字符串类型

    函数描述

    获得表示iNumber十六进制字符串,宽度不足iCount 时,前面补0。

    举例

    TQ_GetHexStringEx(12,2); 返回 “0C”
    TQ_GetHexStringEx(12,8); 返回 “000000C”

实现

    题干理解

    题干说的大意比较清晰,但是细节方面没什么规定,大意是:输入一个10进制的数和一个位数限制,如果转换后位数不足,前面补0。

    界面图

        《一道笔试题:C#下十进制转十六进制》

    代码

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {

    }
    /// <summary>
    /// 获取初始值,并运算
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        int iNumber = int.Parse(txt10.Text);
        int iCount = int.Parse(txtNum.Text);
        string n = TQ_GetHexStringEx(iNumber, iCount);
        txt16.Text = n;
    }


    /// <summary>
    /// 根据输入的十进制数和规定的位数,返回16进制字符串
    /// </summary>
    /// <param name="iNumber">十进制数字</param>
    /// <param name="iCount">规定的位数</param>
    /// <returns>转换完毕的字符串</returns>
    public string TQ_GetHexStringEx(int iNumber, int iCount)
    {
        try
        {
            string strReturn="";
            //数字小于16时
            if (iNumber<16)
            {   
                //数字字符个数大于iCount时,直接返回
                if (iNumber.ToString().Length >= iCount)
                {
                    strReturn =iNumber.ToString();
                }
                //数字小于十六,字符数小于iCount时,补充0
                else
                {
                    //获取需要补充的0的个数
                    int  intDif = iCount - iNumber.ToString().Length;
                    strReturn =FillString(iNumber.ToString(), intDif);
                }
            }
            //数字大于16时
            else
            {
                string strTemp=Convery(iNumber);
                //  转换出来的字符串个数大于所给个数时
                if (strTemp.Length > iCount)
                {
                    strReturn = strTemp ;
                }
                //  转换出来的字符个数小于所给个数时,补充0
                else
                {
                    int intDif = iCount - (Convery(iNumber)).Length;
                    strReturn = FillString(strTemp, intDif);
                }
                    
            }
            return strReturn;
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            //TODO:如果此处涉及废弃内容,删除它们
        }
    }
    /// <summary>
    /// 给出需要补充的字符串和需要补充0的个数,补充字符串
    /// </summary>
    /// <param name="strPre">原字符串</param>
    /// <param name="intNeed">需要补充0的个数</param>
    /// <returns>补充完毕的字符串</returns>
    public string FillString(string strPre, int intNeed)
    {
        try
        {
            string strTemp = "";
            string strFinal = "";
            //字符串前补充0
            for (int i = 0; i < intNeed ; i++)
            {
                strTemp = strTemp + "0";
            }
            strFinal = strTemp + strPre.ToString();
            return strFinal;
        }
        catch (Exception e)
        {
            throw e;
        }
    }
    /// <summary>
    /// 返回数字对应的16进制字符
    /// </summary>
    /// <param name="strNum">10进制数字</param>
    /// <returns>对应的A-F字符</returns>
    public string ToLetter(int intNum)
    {
        try
        {
            string  strTemp = "";
            //如果小于10不用转换,直接返回
            if (intNum<10)
            {
                strTemp = intNum.ToString();
                return strTemp;
            }
            //如果是10-15,则转换
            switch (intNum)
            {
                case 10:
                    strTemp= "A";
                    break;
                case 11:
                    strTemp= "B";
                    break;
                case 12:
                    strTemp= "C";
                    break;
                case 13:
                    strTemp= "D";
                    break;
                case 14:
                    strTemp= "E";
                    break;
                case 15:
                    strTemp= "F";
                    break;
            }
            return strTemp;
        }
        catch (Exception e)
        {
            throw e;
        }
    }
    /// <summary>
    /// 输入大于16的10进制数,转换为16进制
    /// </summary>
    /// <param name="intNum">10进制数</param>
    /// <returns></returns>
    public string Convery(int intNum)
    {
        try
        {
            string x = "";
            int c; //用于存放除以16后的数
            int s = 0;//数组容量
            int n = intNum;//用于确定数组容量
            //获取数组容量
            while (n >= 16)
            {
                s++;
                n = n / 16;
            }
            //建立数组
            string[] m = new string[s+1];


            //填充数组
            int i = 0;
            do
            {
                c = intNum / 16;
                //判断是否大于10,如果大于10,则转换为A~F的格式
                m[i++] = ToLetter(intNum % 16);
                intNum = c;
            } while (c >= 16);
            x = ToLetter(intNum);
            //拼接字符串
            for (int j = m.Length - 1; j >= 0; j--)
            {
                x += m[j];
            }
            return x;
        }
        catch (Exception e)
        {
            throw e;
        }
    }
}

    运行结果

    《一道笔试题:C#下十进制转十六进制》

    很显然,实现起来不难,就算是有些小问题,网上解决方案也很多,但是……我把代码注释写的尽量详细,也提醒了一下同学多理解一下代码,希望不要仅仅为了找工作而学编程。



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