從666666整除7開始的演算法思考

2021-07-28 20:18:21 字數 1277 閱讀 4475

源於一道簡單的奧數題,快速判斷666666是否能被7整除。參考的答案是前三位的666減去後三位的666,所得結果0能夠被7整除,則該數可以被7整除。

由於三位分組相減法存在限制,故只依據末三位相減法,對任意乙個整數

i ,可以設計如下演算法步驟判斷是否能被7整除:

step 1 :判斷多位數整數

i是否為6位數以內。是,轉step 2;否,轉step 4。

step 2 :整數d=

| 高位減末三位

| 。

step 3 :重新賦值,i=

d,轉step 1。

step 4 :整數d=

| 高三位減末三位

| 。

step 5 :若

d整除7,則

i 整除7;否則

i不整除7。

//整除7演算法的c語言實現

#include

#include

#include //用於計時

//末三位相減法——遞迴法

int divide7_recursion(_int64 m)

else

}else

}//末三位相減法——迴圈

int divide7_loop(_int64 m)

else

}//普通整除7演算法

int divide7_normal(_int64 m)

else

}int main(void)}*/

/*末三位相減法——迴圈

for(i=999900000000;i<999999999999;i++) }*/

/*普通演算法

for(i=999000;i<999999;i++) }*/

end = clock();

printf("time=%f\n,count=%lld\n",(double)(end-start)/clk_tck,count);

return

0;}

從證明過程可以發現,末三位相減法的真正核心是因為1001正好可以被7整除,因此對應的是三位整數。由此,完全可以進一步拓展該方法。例如,11能夠整除11,對於整除11的數可以採用末一位相減法;1001也能夠整除13,因此末三位相減法也適用於判斷整除13的數……

c語言**也僅僅只是為了實現該演算法,從彙編指令idiv可以看出,雖然沒有用技巧性的方法,但計算機設計時已經將除法演算法統一用硬體實現,而本文寫的整除演算法建立在應用層,兩者速度不存在可比性。

第一次發文,單純興趣使然,若有不足,歡迎指點。

從遞迴演算法開始學習

1 1 2 3 5 8.用遞迴演算法求第30位數的值?首先我們可以發現從第3位數起後一位數等於前兩位數值之和,即 x x 1 x 2 x 2 這裡需要不斷的相加,第一時刻就會想到迴圈處理,我們嘗試用陣列去裝載這些數值,即 int a new int 30 a 0 1 a 1 1 for int i ...

從排序開始 演算法之旅

每次說到排序,都會想起剛學習c語言那會的氣泡排序還有哨兵設定改進方法。但是看過演算法導論後才知道自己是多麼淺薄,排序的方法有很多。問題描述 輸入 n個數的乙個序列 輸出 序列滿足一定條件 如從大到小或是從小到大 的乙個排列 1 插入排序 思想 從打撲克牌說起,這是乙個很形象的例子,日常生活中抓牌的時...

模式串 從 0 開始的KMP演算法

希望能夠幫到學習kmp的人 include include include kmp.h kmp.h 內容 define maxsize 255 typedef struct sstring void next sstring const t extern int next int indexof k...