LeetCode258 各位相加(棄九法)

2021-09-25 08:33:27 字數 1610 閱讀 2750

原題目

給定乙個非負整數 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,拿到這道題,瞬間就想到了迴圈的解法,感嘆...