如何查詢出或判斷某個數的倍數

2021-10-02 05:48:58 字數 2251 閱讀 1695

其實最直觀的方法,就是如果x對i取余得0,表示x能由i整除,所以x就是i的倍數

if

(x%i==0)

printf

("%d是i的倍數\n"

,x)

但是我們這裡肯定要講別的方法

假如某個數是x的倍數,那麼x就是兩數之間的最大公約數,那麼我們很容易想到歐幾里得遞迴求最大公因數的方法

那我們根據這條性質求出x的倍數

int

func

(int a,

int b)

intmain()

沒寫好,隨便看看吧

通過位運算也可以解決這類問題

先看幾組運算

1111

1111

&0000

0000

=0000

0000

1111

1110

&0000

0001

=0000

0000

1111

1100

&0000

0011

=0000

0000

直觀上來看,任何數&0都會得0,最低位為0的數&1都會得0,依次類推都成立

我們再延伸**一下,

第一組資料中,左值可以取任意的數

第二組資料中,左值同樣可以取得任意的數,只要它的最低位是0

第三組陣列中,…,只要最低兩位都是0

…再翻譯成十進位制

任意數都是1的倍數,成立

只要不是奇數的數都是2的倍數。仔細想想,在2進製中,如果最低位永遠是0,沒有1的存在,該數一定是奇數,就是說該數x可以表示成c1∗

2n+c

2∗2n

−1+.

..+c

n∗21

c_1*2^+c_2*2^+...+c_n*2^

c1​∗2n

+c2​

∗2n−

1+..

.+cn

​∗21

的形式,可以發現該數一定能由2表示,這也是成立的 (通過這條性質我們還可以判斷乙個數的奇偶性)

第三組資料,0000 0011的值是3,那麼某個數&3==0是什麼意思呢?我們不妨列出這些數

0000

0100---

40000

1000---

80000

1100---

12...

...00---.

.

發現只要是最低兩位都不是1的數,它們都有乙個性質,那就是它們一定是4的倍數。。。

那我們這下是不是可以做個推論,只要任意乙個數&x為0,那麼它一定是x的倍數

先驗證一下把,我們查詢6的倍數

0001

1000

&0000

0110

=0000

0000

正確,24是6的倍數

0000

1001

&0000

0110

=0000

0000

錯了,9&6

==0,但是9並不是6的倍數,找到乙個反例,說明上面的結論是不正確的

這時候我們發現任意乙個數&x為0,是這個數是x的倍數的必要條件,而不是充分條件。

再整理一下資料發現,右值的1必須是連續的,這時候我們才能說

對於某個特殊的x,如果某個數&x==0,那麼該數一定是(x+1)的倍數。x的bit從低位開始必須是連續的1

繼續驗證一下,發現這條性質是成立的。但是對於這個特殊的x,如下面這種形式

0000

0001---

1 用於判斷某個數是不是2的倍數

0000

0011---

3 用於判斷某個數是不是4的倍數

0000

0111---

7 用於判斷某個數是不是8的倍數...

....

....

等於說現在又繞回來了 ?…這個方法其實只能判斷某個數是不是x的倍數,$ $

寫了一大堆。。也算是個擴充套件思路的方法把??

int

main()

查詢某個月或某日的記錄

以前總是覺得,寫程式重要的是思路,一些小細節上的東西不用太過於在意,用的時候一查幫助就出來了,實際上這也是可行,只是有些東西,總是找了忘,忘了再找.實在太不方便了,所以現在想想應該把小的東西也記錄下來,以後用的時候也方便.那就從今天遇到的乙個小問題開始吧,如果資料庫中有乙個欄位中是時間,我要查詢某個...

Mysql查詢 如何判斷某欄位是否包含某個字串?

今天乙個群有人向我求助這樣乙個問題,它的mysql表結構和表資料如下圖 mysql查詢 如何判斷某欄位是否包含某個字串 現在,這位群友的要求是 title欄位有1和3的都要查出來,應該如何做?1 單個值查詢使用myql函式 find in set select fromby contentwhere...

如何找出最差效能的查詢

我經常會被反覆問到這樣的問題 我有乙個效能很差的sql server。我如何找出最差效能的查詢?因此在今天的文章裡會給你一些讓你很容易找到問題答案的資訊嚮導。sql server的乙個優點是它本身能回答幾乎所有你的問題,因為sql server在各個dmv和dmf裡儲存了很多故障排除資訊。另一方面這...