如何判斷一個數是否是七的倍數?
我算了一下,我的方法判斷五位數以下還行,但到了五位數以上就麻煩了(我還是初中生,理解有限,專業回答當然好,但更希望有能看懂的~~)
10.3更
我只是一隻圖樣的程序猿,我們院的離散數學還不幸得跳過了數論。。。只能自己自學了一點,表述不準確的地方還望指正。
對題目抽象到一個一般的問題上
如何說明一個整數
X = 0 (mod m)
首先我們先跳過最簡單粗暴的方法-------直接X%m,實在是太沒有技術含量啦
但是仍然可以思考一下這個做除法的過程
比如8638除以7
做第一輪除法後得到餘數是1638
1638和9638一定是同餘的,因為他們之間的差一定是除數乘上現階段的商嘛
然後我們就發現,這種做法的本質就是一直在找一個比它更小的在模m意義下同餘的數,
只不過。。。它是從高位開始搞的。
那麼,可不可以從低位開始搞呢?
顯然也是可以的
把X表示為10x+y
然後對X去掉各位後加上(減去)k倍的y即x+ky
只要這兩個的差是m的倍數那麼顯然這個兩個數也是在模m意義下同餘的數,
但是直接作差的話9x鬼知道是什麼玩意兒,於是將這部分乘10再作差消掉x,這樣就只有一個變數y了。
於是得到(10k-1)y
我們只要取適當的k使得(10k-1) =0 (mod m)就好啦
對這個式子變個形
得到10k+am=1
看到這個式子想到了什麼?
Bingo,擴展歐幾里得!
換個熟悉的形式寫一下,
10x+my=1
在10和m的最大公約數為1的情況下才一定有整數解。(不知道這個定理的,可以從輾轉相減什麼的角度來感受一下,最大公約數是能減掉的最小「單位」)
ok,有了這個理論基礎剩下的就簡單多了
我們只要對相應的m求出這個不定方程的一組整數解就好了
比如,m=3
有這樣一組整數解x=-2和y=7
於是對於一個數能否被3整除我們可以通過去掉最低位並減去最低位的兩倍的方法來驗證
比如說111111
11111-2=11109
1110-18=1092
109-4=105
。。。
至於如何求解擴展歐幾里得這個網上現成東西太多就不獻醜了,隨意查閱就好。
————————————————————————————————————
9.30更
瑪雅,第一個要過百贊的答案
說這個方法並不是因為他速度快只是因為他存在2333333
努力思考了一下,手動算熟練的話應該速度還可以,畢竟只是減去一個兩位數
攤還一下的我估計每次減法影響的位數可能也就三四位(腦補的。。。有人願意精確算的話還希望告訴我答案。。。)原來的方法。。。好吧似乎也就兩三位。。。
而且算每一位的時候只要一次乘2的乘法,大概這點上比手動除法有點優勢。。。
。。。
以上純屬胡扯聽聽就好了,有計算器幹嘛不用計算器。。。
另,python大法好
ps,具體的擴展的話等放假有空補上。
最後謝贊^_^
——————————————————————————————
截去個位,餘下的數減去這個個位的兩倍
重複直到你能看出剩下的數是或者不是7的倍數
例子
1078
107-2*8=91
9-2*1=7
證明原數可表示為10x+y
一次變換後得到x-2y
如果x-2y能被7整除,那麼10x-20y也能被7整除
所以和原數做差21y顯然是7的倍數
由此可得若變換後能被7整除,變換前也是7的倍數
7*11*13=1,001
所以對於一個六位數,如果前三位和後三位一樣,那麼就可以被7整除。
例:123,123=7*17,589
進一步的,對於一個六位數,如果前三位和後三位的差(是個三位數)可以被7整除,那麼就可以被7整除。
例:712,012=7*101,716,(712-012=700=7*100)
再進一步,對於多位數,三位三位地進行分節,對應奇數節的三位數的和 與 對應偶數節的三位數的和 的差可以被7整除,那麼就可以被7整除。
例:12,712,717,003=7*1,716,100,429,((12+717)-(712+3)=14=7*2)
同餘定理,助你理解所有類似問題。
a與b,對d取余後相等,則同餘。
(此處用≡表示同餘關係)
如 5 ( mod 3 ) ≡ 2 ( mod 3 ) = 2
下面是定律。
a ≡ a ( mod d ) 。
a ≡ b ( mod d ) 則 b ≡ a ( mod d )。
a ≡ b ( mod d ) , b ≡ c ( mod d ) 則 a ≡ c ( mod d )。
a ≡ x ( mod d ) , b ≡ y ( mod d ) 則
a±b ≡ ( x±y ) ( mod d )
a×b ≡ ( x×y ) ( mod d )。
a ≡ b ( mod d ) 則 ( a-b ) ( mod d )=0。
很好理解。(如果學過「更相減損」和「輾轉相除」求最大公約數,更好理解)
問,如何證明「各數位相加驗證整除3」?
有
1 ≡ 1 ( mod 3 )
10 ≡ 1 ( mod 3 )
10*10 = 100 ≡ 1 ( mod 3 )
10*10*10=1000 ≡ 1 ( mod 3 )
所以,1000x+100y+10z+c ≡( x+y+z+c )( mod 3 )
當 ( x+y+z+c )( mod 3 )=0時,
則 ( 1000x+100y+10z+c )( mod 3 )=0
等於零就是「整除」。
下面驗證11。
有 1 ≡ 1 ( mod 11 )
( 10+1)( mod 11 ) ≡ 0則
10 ≡ -1 ( mod 11 )
100 ≡ 1 ( mod 11 )
1000 ≡ -1 ( mod 11 )
..........跟3一樣,所以「數位交替加減驗證整除11」
如616,6-1+6=11,所以能整除11。
事實:616=11*56。
下面一起驗證11,13,7。
因為7*11*13=1001,則以7為例
1 ≡ 1 ( mod 7 )
(1000+1) ( mod 7 ) ≡ 0則
1000 ( mod 7 ) ≡ -1 ( mod 7 )
1000000 ( mod 7 ) ≡ 1 ( mod 7 )
.........(7,13,11皆可如此)
所以,「每三位數交替加減可驗證整除11或13或7」。
627599 →28=7*4,整除7
想要知道一個數能不能被 7 整除,就要變革那個數,親自用 7 除一下。
#include &
#include &
using namespace std;
bool mod7(string s){
int sum = 0;
for(int i = 0;i != s.size();++i){
sum = (sum * 10 + (s[i] - "0")) % 7;
}
return sum % 7 == 0;
}
int main(){
string s;
while(cin &>&> s){
if(mod7(s))cout &<&< "YES" &<&< endl;
else cout &<&< "NO" &<&< endl;
}
return 0;
}
等我翻下數論的課本.
********************************
這條定理說的還是比較通俗的,應該可以理解吧。
下面幾個截圖是證明過程。
然後根據定理2.1.5就可以得到定理2.1.7了.
if (n%7 == 0) {
printf("n能被7整除");
} else {
printf("n不能被7整除");
}
題主,你既然能上知乎,想必你早就度娘過了。恕我冒犯,我覺得你無非就是「初中生」、「我自己的方法…」有點小自得?其實這種問題你度娘即可,免得招致一些戾氣很重的回答。
方法如下
1.一個數是7的倍數,當且僅當,其末一位的兩倍,與剩下的數之差為7的倍數。
2.一個數是7的倍數,當且僅當,其末三位數,與剩下的數之差為7的倍數。
例1. 483
483的末一位是3
3x2=6
48-6=42
42能被7整除,所以483能被7整除
例2. 12047
12047的末三位是04747-12=35
35能被7整除,所以12047能被7整除
難道不是:一個數末一位的兩倍與剩下數的差是7的倍數,這個數就是7的倍數;or 一個數末三位與剩下數的差是7的倍數,這個數就是7的倍數。
計算器算一下
三五求七法則,原創但不排除有人捷足先登提前提出。(可跳過文字描述直接看例子)
任取一個大於十的整數,將其分割為除以十所得的商和餘數兩部分,分別記為S和Y。(S為商的首字母大寫,Y為餘數的首字母大寫)
1.假如3S+Y或S+5Y能被七整除,則原數為七的倍數。
2.假如3S+Y或S+5Y太大以至於不能一眼看出是否為七的倍數,則將3S+Y或S+5Y看作另一個整數繼續進行除以十後的取商取余工作,然後得出新的S和Y值,繼續用3S+Y或S+5Y進行計算,最終將原數化作一個小到足以一眼看出是否為七的倍數的數來判斷。
我覺得幾乎沒人能弄懂我上面都說了些什麼,所以我會舉幾個例子。
例1:原數63, S=6, Y=3。 3S+Y=21或S+5Y=21,很明顯21是七的倍數,所以原數63也應該是7的倍數。
例2:原數35, S=3, Y=5。 3S+Y=14或S+5Y=28,很明顯14和28是七的倍數,所以原數35也應該是7的倍數。
例3:原數161=23×7, S=16, Y=1。 3S+Y=49或S+5Y=21,很明顯49和21是七的倍數,所以原數161也應該是7的倍數。
例4:原數4746=678×7, S=474, Y=6。 3S+Y=1428或S+5Y=504,很明顯1428和504無法一眼看出是否為七的倍數,則對其繼續進行分解。
( 這時可以看出使用「三五求七」法則時「五」和「三」相比具有巨大的優越性,因為「五」可以顯著減少5S+Y的位數,從而使計算步驟大大減少。)
(接下來只用「五」進行解答,但是「三」仍然成立,棄用它只是因為用起來極不方便罷了。)
對於上面的504,將其作為原數, S=50, Y=4。 S+5Y=70,很明顯70是七的倍數,所以504 ,4746也應該是7的倍數。
取S+5Y =67,089,673為原數,則S =6,708,967 ,Y =3;
取S+5Y =6,708,982為原數,則S =670,898,Y =2 ;
取S+5Y= 670,908為原數,則S =67,090,Y =8;
取S+5Y =67,130為原數,則S =6713;Y=0;
取S+5Y =6713為原數,則S=671,Y=3 ;
取S+5Y =686為原數,則S =68;Y =6;
取S+5Y =98為原數,則S =9 ;Y =8;
取S+5Y =49為原數,則可一眼看出49 =7×7,因為49是7的倍數,所以670,896,436也應該是7的倍數。證明完畢。
佔個坑有空填
因為7×142857=999999,所以可以把一個數6位一分割,把每一部分加起來,反覆這項操作,直到數字小於六位為止。
然後筆算就可以了。
用計算器啦……笨~
對於7我記得有個1、3、2、-1、-3、-2的循環數列,作為係數從個位開始乘,算得同餘的數,重複此數列至最終就是餘數了。
比如……a3a2a1a0=……+a3*10^3+a2*10^2+a1*10^1+a0*10^0,同餘的就是a0*(1)+a1*(3)+a2*(2)+a3*(-1) +……
棄九驗算那個直接各個數位數字相加就是1、1、1、1……的特例吧。
判定的這數列默認1開始,後一項是前項的10倍再取余,上邊-2後是1,也就產生循環。
當除數&>10,借鑒二進位相鄰數湊一組轉換2^n進位的情況,視為10^n進位處理。加上餘數是有限的,所以一定會循環,所以這算是通法。
直接除也挺快的吧?
推薦閱讀: