交替数字和(c语言+解析)

给你一个正整数n。n中的每一位数字都会按下述规则分配一个符号:

最高有效位上的数字分配到正号。
剩余每位上数字的符号都与其相邻数字相反。
返回所有数字及其对应符号的和。

(来源:力扣(LeetCode)链接:https://leetcode.cn/problems/alternating-digit-sum)

实例:

输入:n = 521
输出:4
解释:(+5) + (-2) + (+1) = 4

输入:n = 111
输出:1
解释:(+1) + (-1) + (+1) = 1

输入:n = 886996
输出:0
解释:(+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0

 分析:对于一个int的多位数,在利用c语言处理时,我们只能从最末尾处理该数字(%)所以我们可以在一个循环里依次处理末尾的数字;其次因为相邻数字的符号是相反的,我们可以专门定义一个一个int型变量来表示符号位;最后再把每位数字相加就是最后的和。

暴力求法:

//在暴力算法中,我们定义一个count变量来记录这是几位数,并用奇偶来表示符号

//例如:985:输出顺序5-8+9=6;此时count=3(表示三位数)所以是和9-8+5的一样的;
//例如:985211:输出顺序1-1+2-5+8-9=-4;此时count=6,而按题意的总和应该为9-8+5-2+1-1=4,与函数表示相反
//故当count为偶数的时候,num取相反数字

int alternateDigitSum(int n)
{
    int sum = 0;//定义一个总和
    int this_num;//每次循环得出的最尾的数字
    int count = 0;//记住这是一个几位数
    while (n)//循环中n=0结束循环
    {   
        count++;//每次进入循环,就表示位数+1
        this_num = n % 10;
        //用count的奇偶来表示相邻的数字符号相反
        if (count % 2 == 1)
        {
            sum = sum + this_num;
        }
        else
        {
            sum = sum - this_num;
        }
        n = n / 10;
    }
    //由上述分析中,当count为奇数sum值就是题目中要求的输出值,而count值为偶数我们要取相反数
    if (count % 2 == 1)
    {
        return sum;
    }
    else
    {
        return -sum;
    }
}

简略求法(思路与暴力一致)

int alternateDigitSum(int n) 
 {
//这里我们用res表示总和,并定一个sign让其在1和-1中反复弹跳
//例如:985:输出顺序5-8+9=6;因为sign的正负表示下一次进循环的正负值,所以,结束后sign为负数   所以在最后return时我们要乘上-sign;而位数为偶数时恰恰相反。
    int res = 0, sign = 1;
    while (n > 0) 
    {
        res += n % 10 * sign;
        sign = -sign;
        n /= 10;
    }
    return -sign * res;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值