問題描述
打印所有不超過n(取n<256)的其平方具有對稱性質的數(也稱回文數)。
問題分析
對於要判定的數n計算出其平方后(存於a),按照“回文數”的定義要將最高位與最低位、次高位與次低位……進行比較,若彼此相等則為回文數。此算法需要知道平方數的位數,再一一將每一位分解、比較,此方法對於位數已知且位數不是太多的數來說比較適用。
此問題可借助數組來解決。將平方后的(a的)每一位進行分解,按從低位到高位的順序依次暫存到數組中,再將數組中的元素按照下標從大到小的順序重新將其組合成一個數眾(如n=15,則a=225且k=522),若k等於n×n則可判定n為回文數。
算法設計
從低位到高位將某一整數拆分。對於一個整數(設變量名為a)無論其位數多少,若欲將最低位拆分,只需對10進行求模運算a%10,拆分次低位首先要想辦法將原來的次低位作為最低位來處理;
用原數對10求商可得到由除最低位之外的數形成的新數,且新數的最低位是原數的次低位,根據拆分最低位的方法將次低位求出a/10、a%10,對於其他位上的數算法相同。
利用這個方法要解決的一個問題就是,什么情況下才算把所有數都拆分完?
當拆分到只剩原數最高位時(即新數為個位數時),再對10求商的話,得到的結果肯定為0,可以通過這個條件判斷是否拆分完畢。
根據題意,應將每次拆分出來的數據存儲到數組中,原數的最低位存到下標為0的位置,次低位存到下標為1的位置……依次類推。
————————
程序段如下:
for (i=0; a!=0; i++)
{
m[i] = a % 10;
a /= 10;
}
將數組中元素重新組合成一新數。
拆分時變量a的最高位仍然存儲在數組中下標最大的位置,根據“回文數”定義,新數中數據的順序與a中數據的順序相反;
所以我們按照下標從大到小的順序分別取出數組中的元素組成新數k,由幾個數字組成一個新數時只需用每一個數字乘以所在位置對應的權值然后相加即可;
在編程過程中應該有一個變量t來存儲每一位對應的權值,個位權值為1,十位權值為10,百位權值為100……,所以可以利用循環,每循環一次t的值就擴大10倍。
對應程序段如下:
for( ; i>0; i--)
{
k += m[i-l] * t;
t *= 10;
}
————————
下面是完整的代碼:
#include<stdio.h> int main() { int m[16], n, i, t, count=0; long unsigned a, k; printf("No. number it's square(palindrome)\n"); for( n=1; n<256; n++ ) /*窮舉n的取值范圍*/ { k=0; t=1; a=n*n; /*計算n的平方*/ for( i=0; a!=0; i++ ) /*從低到高分解數a的每一位存於數組m[1]~m[16]*/ { m[i] = a % 10; a /= 10; } for(; i>0; i--) { k += m[i-1] * t; /*t記錄某一位置對應的權值 */ t *= 10; } if(k == n*n) printf("%2d%10d%10d\n", ++count, n, n*n); } return 0; }
運行結果:
No. number it's square(palindrome)
1 1 1
2 2 4
3 3 9
4 11 121
5 22 484
6 26 676
7 101 10201
8 111 12321
9 121 14641
10 202 40804
11 212 44944

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
【值得關注】我的 C/C++編程學習交流俱樂部【點擊進入】
問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~