题解 | #小乐乐与进制转换#

小乐乐与进制转换

http://www.nowcoder.com/practice/242eafef2a704c0ca130d563b7b3ee2d

做这道题我们可以采用短除法来将十进制转换为六进制。我们先来看看什么短除法:
图片说明

我们发现,我们一次取余数,然后将余数逆序,就可以得到六进制的表示(实际对于其他进制也是如此哦)。
那么我们就可以知道,要想解决这个问题,我们只需要实现短除法,然后逆序输出就好。
关于实现短除法,我们可以通过循环实现。类似于这样。m是求得的余数,然后n=n/6,再次进入循环,最后n/6=0的时候循环结束。

while(n)
{
  m=n%6;
  n=n/6;
}

然后我们就要考虑,如何将每次循环得到的数字逆序输出。一种比较简单的方法是设计一个数组,用数组来存放每次得到的数字,然后逆序输出。这种实现方法很好实现,代码如下:

#include<stdio.h>
int main()
{
    int n,i=0,num[100],j;
    scanf("%d",&n);
    while(n/6!=0)
    {
        num[i]=n%6;
        n=n/6;
        i++;
    }
    printf("%d",n);
    for(j=i-1;j>=0;j--)
        printf("%d",num[j]);
    return 0;
}

如果我们再来不想通过逆序输出数组来实现,其实我们还可以采用递归的方法,代码如下:

#include<stdio.h>
void fun(int n)
{
    int m;
    if(n==0);//n=0时,停止
    else
    {
        m=n%6;
        fun(n/6);
        printf("%d",m);
    }
}
int main()
{
     int n;
    scanf("%d",&n);
     fun(n);
    return 0;
}

还有另一种写法,也是利用递归,代码如下:

#include <stdio.h>

long long int Six(int n)//防止越界,用long long int
{
    if (n / 6 == 0)
    {
        return n % 6;
    }
    else
    {
        return (n % 6) + Six(n / 6) * 10;
    }
}

int main()
{
    int n = 0;

    scanf("%d", &n);
    printf("%lld\n", Six(n));

    return 0;
}

采用递归之后,我们便可以根据递归的实现过程巧妙地实现逆序,不过递归是一种十分消耗性能的方法,在需要处理较多数据的时候,不建议采取递归哦。
好的,这道题就分析到这里啦,希望对大家有所帮助哦。

全部评论

相关推荐

05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
06-12 16:50
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务