源於一道簡單的奧數題,快速判斷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...