實例19:判斷正整數n的d進位表示形式是否是迴文數(順著看和倒著看相同的數)。 主要思路: 一種方法:將正整數n數轉換成d進位的數,逐個比較首尾對應數字,判斷是否為迴文數。 另一種方法:將正整數n數轉換成d進位的數,將低位數當做高位數,轉換成正整數判斷與原來的數是否相等。 書中採用的是第二種方法,下 ...
實例19:判斷正整數n的d進位表示形式是否是迴文數(順著看和倒著看相同的數)。
主要思路:
一種方法:將正整數n數轉換成d進位的數,逐個比較首尾對應數字,判斷是否為迴文數。
另一種方法:將正整數n數轉換成d進位的數,將低位數當做高位數,轉換成正整數判斷與原來的數是否相等。
書中採用的是第二種方法,下麵的程式中與實例18相結合,實例18中對無符號整數進行轉換,但是在實際的編程中從結果上看沒有太大的區別。
(代碼與書中代碼有一定出入)
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define M sizeof(unsigned int)*8 5 6 /*實例18中主要用到的函數,將無符號整數轉換成d進位數*/ 7 int Trans(unsigned n, int d, char s[]) 8 { 9 static char digits[] = "0123456789ABCDEF"; 10 char buf[M+1]; 11 int i, j = M; 12 13 if(d<2 || d>16) 14 { 15 s[0] = '\0'; 16 return 0; 17 } 18 19 buf[i] = '\0'; 20 do 21 { 22 buf[--i] = digits[n%d]; 23 n /= d; 24 }while(n); 25 26 for(j=0; (s[j] = buf[i]) != '\0'; j++,i++); 27 return j; 28 } 29 30 /*函數circle用於判斷正整數n的d進位數表示形式是否是迴文數*/ 31 int Circle(int n, int d) 32 { 33 int s = 0; 34 int m = n; 35 36 while(m) 37 { 38 s = s*d + m%d; 39 m /= d; 40 } 41 42 return s == n; 43 } 44 45 int scale[] = {2,10,16,8}; //需要轉換成的進位(d進位) 46 int num[] = {232, 27, 851, 123, 111}; //需要轉換的整數 47 48 int main() 49 { 50 char Str_Trans[33]; 51 int i, j; 52 53 for(i=0; i<sizeof(num)/sizeof(num[0]); i++) 54 { 55 for(j=0; j<sizeof(scale)/sizeof(scale[0]); j++) 56 { 57 Trans(num[i], scale[j], Str_Trans); 58 if(Circle(num[i], scale[j])) 59 printf("%3d -> %10s -> (%2d) is a Circle Number!\n", num[i], Str_Trans, scale[j]); 60 else 61 printf("%3d -> %10s -> (%2d) is not a Circle Number!\n", num[i], Str_Trans, scale[j]); 62 } 63 } 64 printf("\n Press any key to quit...\n"); 65 return 0; 66 }