卡普雷卡數

2021-07-25 07:34:11 字數 3689 閱讀 2490

傳說數學家卡普雷卡(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卡一樣,只是比...