每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)
今日问题:
给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入:38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11
, 1 + 1 = 2
。由于 2
是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
解决方法:
两个概念:
九余数定理:如果把一个大数的各位数字相加得到一个和,再把这个和的各位数字相加又得一个和,再继续作数字和,直到最后的数字和是个位数为止,
这最后的数称为最初那个数的“数字根”。
这个数字根等于原数对9的取余的余数,因此这个计算过程常常称为“合九法”
一个数对9求余的结果,成为九余数。
定理:某个数各个位上的数相加对九求余等于这个数的九余数。
例子:1234%9=1
(1+2+3+4)%9=1
二者相等。
同余定理:两个数的乘积对m取余的余数等于这两个数分别对m取余的余数的乘积。
例如:7%3=1
5%3=2
(7*5)%3 = 2 = 1 * 2
算法思想:
运用“合九法”。让num直接对9取余即可。
注意:个位数9得单拎出来解决哦!当然还有0.
C++代码:
C代码:
Java代码:
明日题目预告:
字符的最短距离
给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
示例 1:
输入: S ="loveleetcode", C = 'e'
输出: [3, 2, 1, 0, 1,0, 0, 1, 2, 2, 1, 0]
说明:
字符串 S 的长度范围为 [1, 10000]。
C 是一个单字符,且保证是字符串 S 里的字符。
S 和 C 中的所有字母均为小写字母。