浅谈牛客网题目“小乐乐改数字”

一、引例 - 牛客网OJ题

为了更好地说明这个问题,我们以一道牛客网的题目作引例。题目链接贴在这里

小乐乐改数字_牛客题霸_牛客网小乐乐喜欢数字,尤其喜欢0和1。他现在得到了一个数,想把每位的数变成0或1。如果某一位是奇。题目来自【牛客题霸】icon-default.png?t=N7T8https://www.nowcoder.com/practice/fcd30aac9c4f4028b23919a0c649824d?tpId=290&tqId=632017&ru=%2Fpractice%2F4ef07b4f80fc4027a4b90e2245f8f637&qru=%2Fta%2Fbeginner-programmers%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E8%25AF%25AD%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D290

题干如下

基本思路

这道问题的首先一步应该考虑到将输入数字的各个位数求出,并进行判定每位数字是奇数还是偶数

并根据奇偶性进行赋值,若为奇数,则赋值1;若为偶数,则赋值0;想到这里并不难,困难的是我们该如何将赋值后的数字符合题目要求地打印出来。今天让我们来分享一些在卧虎藏龙的牛客网中牛人的解题方法和解题思路。

二、范例

范例一

from 西西西西西西西

#include <stdio.h>
#include <math.h>
int main() {
    int n = 0;
    scanf("%d", &n);

    int ret = 0;
    int i = 0;
    while (n) {//while(n)表示当n=0的时候循环停止
                  //相当于while(n!=0),因为当while循环为0时为fault,
                     //计算机默认当结果为fault时不进入循环
        int num = n % 10;
        if (0 == num % 2)
                    //判断num是否为偶数
            num = 0;
        else //因为一个数字不是奇数就是偶数,
                    //上面已经判断出来偶数的情况
            /           /因此不必判断if(1==num%2)或者if(0!=num%2)
            num == 1;
        ret += num * pow(10, i++);
                      //每循环一次i++自增,
                         // 每一次循环除10,第i次循环就是除10^i,
                              //pow(10,i++)乘以10^n
        n /= 10;
    }

    printf("%d", ret);
            return 0;
    }

以上便是大佬的代码,思路清晰严谨,那么请允许我化身一次高鹗,为这代码作注释。

友情提醒,我将原代码中的w换成num,因为w做变量相对不常见,换成num看代码的时候就不会

花精力思考w是代指什么,多花时间在反应上,从而提高理解代码的效率。

知识点
pow(x,y)函数

表示x的y次方的函数,头文件为<math.h>

完整形式是double pow(double x,double y)

可能导致错误的情况:

如果底数是负数并且指数不是整数,则会导致定义域错误(domain erorr)
如果底数和指数都为零,则还可能导致定义域错误(domain erorr)
如果底数为零且指数为负,则可能会导致定义域错误(domain erorr)极点错误(pole error)(也可能没有,具体取决于库实现)。
如果结果太大或太小而无法用返回类型的值表示,该函数也可能会导致范围错误(range error)

详情见

cplusplus.com/reference/cmath/pow/icon-default.png?t=N7T8https://cplusplus.com/reference/cmath/pow/

范例二

from   1213812

#include <stdio.h>

int bian(long long n)
{
    int b = n%10;//
    int c = b%2;
    n = n/10;
    if( n  )

        return 10 * bian(n) +c;
 
    return c;
}

int main()
{
    long long n = 0;
    scanf("%lld",&n);
    int a = bian(n);
    printf("%d",a);
    return 0;
}

在下在这里不得不要佩服1213812大佬的思维,简直惊为天人,以 int c= b%2的方式巧妙地避免了用  if 语句判断奇偶性并赋值的过程,使代码更加简洁高效。

笔者认为,递归的难点在于一次次递归需要很强的想象力,因此笔者建议在考虑递归问题的时候在草稿纸上模拟递归进行,可以简化思考的难度,并更加深入的了解递归。

知识点
递归的两个必要条件

1)递归存在限制条件,当满足这个必要条件的时候,递归就不再继续。

2)每次递归调用之后,越来越接近这个条件。

  • 23
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值