欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言实例解析精粹学习笔记——19

程序员文章站 2022-05-04 14:03:47
实例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 }