原題目
給定乙個非負整數 num,反覆將各個位上的數字相加,直到結果為一位數。示例:輸入: 38
輸出: 2
解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於 2 是一位數,所以返回 2。
高階:你可以不使用迴圈或者遞迴,且在 o(1) 時間複雜度內解決這個問題嗎?
題目大意
無題目分析
棄九法(九餘數法):
設乙個三位數n,百位為x,十位為y,個位為z:
則n=x100+y10+z
=>n=x99+y9+(x+y+z)
=>n%9=(x+y+z)%9
結論推廣:某數除以九的餘數等於其各位上的和除以九的餘數
1234567891011121314……201020112012除以9,商的個位數字是多少?
【解析】根據「棄9法」原理,判斷這個多位數除以9 的餘數可以直接看數字和除以9的餘數,這個多位數是由1,2,3,4,5,6,……,2011,2012這些連續的自然數構成,而對於每乙個自然數來說,除以9都是同余於它的各個位上數字之和,於是有:
1+2+3+….+2011+2012≡2025078≡2+2+2+5+0+7+8(mod 9),所得餘數為6,這就說明123456….20112006是9的倍數,那麼商的個位數字就是4。(4×9=36)
應用:(1)檢驗加法時,如果各個加數九餘數之和(如超過9再減去9的倍數)等於和的九餘數時,計算結果可能就是正確的。
(2)檢驗減法時,如果被減數的九餘數減去減數的九餘數所得的差,等於差的九餘數時,計算結果可能就是正確的。
(3)檢驗乘法時,如果被乘數的九餘數與乘數的九餘數之積的九餘數,等於積的九餘數,計算結果可能就是正確的;反之則是錯誤的。
( 4)檢驗除法時,可以用乘法逆運算的辦法進行。即:商×除數=被除數。當商的九餘數和除數的九餘數之積的九餘數,等於被除數的九餘數時,計算結果可能是正確的,反之則是錯誤的。
這種棄九驗算法的根據是:利用被9整除數的特徵。乙個數的棄九數就是這個數被9除后的餘數(如果棄九數是0,說明能被9整除)。如果等號兩邊的餘數相同,證明原來計算可能是正確的;等號兩邊的餘數不相同,說明計算結果是錯誤的。
題目解析
迴圈法:每次對各位上的數相加,直到數只有一位停止迴圈
棄九法:直接取餘九,如果本身為0,九餘數為0,該值不為0取餘九為0,九餘數為9
否則為該值取餘九的餘數
完整**
執行用時 :int
adddigits
(int num)
a=res;
res=0;
}return a;
}
0 ms, 在所有 c 提交中擊敗了100.00%的使用者
記憶體消耗 :
6.8 mb, 在所有 c 提交中擊敗了5.92%的使用者
執行用時 :int
adddigits
(int num)
0 ms, 在所有 c 提交中擊敗了100.00%的使用者
記憶體消耗 :
6.6 mb, 在所有 c 提交中擊敗了62.13%的使用者 總結
了解棄九法的相關知識
LeetCode 258 各位相加
題目描述 給定乙個非負整數num 反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38 輸出 2 解釋 各位相加的過程為 3 8 11,1 1 2。由於 2 是一位數,所以返回 2。解題思路 輸入的數為非負數,當輸入的數為個位數的時候不用疊加直接輸出 ac 1 int adddigits i...
LeetCode 258 各位相加
給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38輸出 2解釋 各位相加的過程為 3 8 11,1 1 2。由於2是一位數,所以返回 2。class solution def adddigits self,num type num int rtype int sum...
LeetCode 258 各位相加
給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38輸出 2解釋 各位相加的過程為 3 8 11,1 1 2。由於 2 是一位數,所以返回 2。高階 你可以不使用迴圈或者遞迴,且在 o 1 時間複雜度內解決這個問題嗎?emmm,拿到這道題,瞬間就想到了迴圈的解法,感嘆...