傳說數學家卡普雷卡(kaprekar)偶然發現鐵路旁的里程碑「3025」被雷擊得一分為二:30與25.他敏銳地注意到:30+25=55,55^2=3025。
現稱這樣具有分段和平特性的整數為卡普雷卡數。
先**搜尋4位卡普雷卡數的基礎上引申至一般偶數字卡普雷卡數,並進一步拓廣到2段和平方數。
乙個4位整數分為前後兩個2位數,若該數等於所分兩個2位數和的平方,則稱該數為4位卡普雷卡數。
試求出所有的4位卡普雷卡數。
1.說明:
設4位整數a=b*b,存在以下兩個列舉方案:
(1)、迴圈列舉所有4位整數a,應用取整函式(int)和求餘(%)把a分段為前後兩個2位整數x,y,通過條件判別:若滿足a=(x+y)^2且y>=10,即找到卡普雷卡數a,進行列印輸出;
(2)、迴圈列舉2位整數b,求出a=b*b,對平方數a同上分段為前後兩個2位整數x,y,進行判別:若滿足b=x+y且y>=10,即找到卡普雷卡數a,進行列印輸出。
顯然方案二的列舉次數較少,較為簡單。
2.程式設計:
#include#includeint main()
printf("\n");
}
3.程式執行示例及其注意事項:
4位卡普雷卡數有:2025,3025,
注意:分段和條件檢驗中的y>=10是確保y為2位數。若去除y>=10的限制,則還有9801,該數分解的兩段,前段為乙個2位數98,後段是乙個1位數1,不符合「分段為前後兩個2位整數」的要求。
偶數n位卡普雷卡數分為前後兩個n/2位整數,該數等於所分兩個數和的平方;
輸入偶數n(4<=n<=14),輸出所有的n位卡普雷卡數。
1.說明:
注意到n超過10位,相關變數設定為雙精度實型。
1)、設定列舉迴圈;
設n位平方數a=b*b,求出b的最小值c與最大值d,
設定b(c~d)迴圈,迴圈中a=b*b即為n位平方數。
2)、實施分段;
同時設定分段特徵量w=10^(n/2),對平方數a應用取整x=floor(a/w)和求餘y=fmod(a,w)計算a分段前後的兩個n/2位整數x,y。
3)、分段和判別;
如果後一段首位為0,則導致整數y不足n/2位,為此需要加上條件y>=w/10,
若滿足條件b=x+y且y>=w/10,即找到n位卡普雷卡數a,進行列印輸出。
2.程式設計:
#include#includeint main()
printf("%d位卡普雷卡數有: \n",n);
for(m=1,k=2;k<=n;k++)
m*=10;
for(w=1,k=1;k<=n/2;k++)
w*=10;
c=(long)pow(m,0.5); /*求出列舉b迴圈的起點*/
d=(long)pow(10*m-1,0.5); /*求出列舉b迴圈的終點*/
for(b=c+1;b<=d;b++)
}
3.程式執行示例及其注意事項:
請輸入偶數n位(n<=14): 14
14位卡普雷卡數有:
19753082469136=(1975308+2469136)^2
24284602499481=(2428460+2499481)^2
25725782499481=(2572578+2499481)^2
30864202469136=(3086420+2469136)^2
注意:以上所得4個14位卡普雷卡數,所分的前後兩段都是7位整數。
作為卡普雷卡數的進一步推廣,推出2段和平方數。
定義:把乙個n位正整數a分為前後兩段(兩段的位數不要求相等,兩段所生成的兩個正整數的位數之和也不要求等於n),若分段的兩個正整數之和的平方等於a,則稱a為2段和平方數。
例如:88209=(88+209)^2,88209就是乙個把自身分為兩段「88」與「209」的和的平方數,即2段和平方數。
顯然,前面的偶數字卡普雷卡數是偶數字2段和平方數的特例,
輸入位數n(2<=n<=16),搜尋並輸出所有的n位2段和平方數。
1.說明:
注意到n位數比較大,n位數及其相關資料設定為雙精度實型。
1)、設定列舉迴圈;
設a=b * b,a為n位整數,求出b的取值範圍[c,d],設定列舉b(c~d)迴圈,迴圈中計算的a=b * b確保為n位平方數,
2)、實施分2段;
把乙個n位數分為前後兩段有n-1種分法:設定分段操作的k(1~n-1)迴圈,迴圈中模擬分段的變數w從1開始,通過自乘10可分別得w=10,100,…,10^(n-1)。應用取整x=floor(a/w)和取餘y=fmod(a,w)等操作把整數a分為前後兩個整數x和y。
3)、分段和條件檢驗;
在分段操作的k(1~n-1)迴圈中,每分段得兩個整數x和y,檢驗若b=x+y,則滿足分段和平方數條件,
注意到如果後段的首位可能為0,則兩個正整數x,y的位數之和可能小於n,這是允許的;如果後段全部為0,則整數y為0而非正整數,這是不允許的,
因而在分段和條件檢驗中,除了檢驗b=x+y之外,需要加上條件y>0 。
2.程式設計:
#include#includeint main()}}
if(s>0)
printf("共%d個%d位2段和平方數。\n",s,n);
else printf("沒有%d位2段和平方數。\n",n);
}
3.程式執行示例及其注意事項:
請輸入正整數n(3<=n<=15):11
20408122449=(20408+122449)^2
21948126201=(21948+126201)^2
33058148761=(33058+148761)^2
35010152100=(35010+152100)^2
43470165025=(43470+165025)^2
共5個11位2段和平方數。
注意:執行程式可知,若位數n為奇數時,所分兩段位數一般只相差1(如n=11時,一段為5位,另一段為6位);若位數n為偶數時,所分兩段位數相等(如n=14時,兩段都為7位)。
因此,對以上程式前後兩端實施n-1種分發應該可以簡化:
#include#includeint main()
w*=10;}}
if(s>0)
printf("共%d個%d位2段和平方數。\n",s,n);
else printf("沒有%d位2段和平方數。\n",n);
}
數學黑洞 卡普雷卡爾常數的php演算法實現
首先看一篇文章 英國廣播公司報道,6174乍看沒什麼奇特之處,但是,自從1949年以來,它一直令數學家 數字控抓狂 痴迷。不管你挑的四位數是什麼,早早晚晚你都會遇到6174 而且,遇到6174就只能止步,否則面臨的將是無休無止的無用功了。祝賀一下,現在你總算搞懂了卡普雷卡爾常數 kaprekar s...
Catalan number 卡蘭特數)
卡特蘭數非常經典,很多現實的問題都是卡特蘭數,如合法的入棧出棧序列有多少種就是卡特蘭數,為什麼呢?我們可以把0看成入棧操作,1看成出棧操作,即0的累計個數不小於1的排列有多少種。還有很多其他的問題都是卡特蘭數,如二叉樹的個數,有序樹的個數,多邊形分成三角形的個數等。卡特蘭數的通項是c 2n,n n ...
SD卡 MMC卡 MS卡 TF卡
sd卡 secure digital memory card 中文翻譯為安全數碼卡 是一種基於半導體快閃記憶器的新一代記憶裝置。sd卡由日本松下 東芝及美國 sd卡的技術是基於 卡 mmc 格式上發展而來,大小和mmc卡差不多,尺寸為32mm x 24mm x 2.1mm。長寬和mmc卡一樣,只是比...