C语言实例解析精粹学习笔记——19
实例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 }