给你一个正整数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;
}