C语言实例分析优良学习笔记——19

实例19:判断正整数n的d进制表示情势是不是是回文数(顺着看和倒着看无差别的数)。

重中之重思路:

一种办法:将正整数n数转换到d进制的数,每一个比较首尾对应数字,判断是还是不是为回文数。

另一种艺术:将正整数n数转换到d进制的数,将低位数当做高位数,转换到正整数判断与原先的数是或不是等于。

书中央银行使的是第3种办法,下边包车型大巴程序中与实例18相结合,实例1第88中学对无标志整数实行更换,但是在实质上的编制程序中从结果上看没有太大的区分。

(代码与书中代码有早晚出入)

 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 }

 

相关文章