C语言实例分析精粹学习笔记——18

《C语言实例分析精粹》中编译环境下的是Turbo C
2.0。但是这个编译器年代久远,较新的编译器对写中之一点例子支持不好,在攻读的下又开片笔记。

实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和反着圈无异之高频)。

实例18:将一个无符号整数转换为任意d进制(d在2~16之间)。

首要思路:

要害思路:对管标志整数n求d的余数,就会得n的d进制的最低位数字,重复上述手续,直至n为0。依此得到n的d进制表示的最低位到高位数字,由数字转换成字符,得到结果。

一如既往种办法:将正整数n数转换成d进制的多次,逐个比首尾对许数字,判断是否为扭转文数。

 1 /*函数trans将无符号整数n转换成d进制(2<=d<=16)
 2 表示的字符串s*/
 3 #define M sizeof(unsigned int)*8 //将无符号数转换为字符串,每个字符8位
 4 int trans(unsigned n, int d, char s[])
 5 {
 6     static char digits[] = "012345678ABCDEF";
 7     char        buf[M+1];
 8     int         j, i = M;
 9     
10     if(d<2 || d>16)
11     {
12         s[0] = '\0'; //字符串的截至位
13         return 0;
14     }
15     
16     buf[i] = '\0';
17     do
18     {
19         buf[--i] = digits[n%d];
20         n /= d;
21     }while(n);
22     /*将工作数组中的字符串复制到s*/
23     for(j=0; (s[j]=buf[i]) != '\0'; j++,i++);
24     return j;
25 }
26 
27 int main()
28 {
29     unsigned int num = 0;
30     int          scale[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,1}; //进制2~16
31     char         str[33];
32     int          i;
33     clrscr();   //清屏函数只在Turbo中使用 采用的方案是将其改为system("cls")
34                 //但实际测试中此程序是否由这句对结果并没有什么影响。
35     puts("Please input a number to translate:");
36     scanf("%d", &num);
37     printf("The number you input is %d.\nThe translation result are:\n",num);
38     //此循环用来测试,显示同一个无符号整数转换成不同进制的结果。
39     for(i=0; i<sizeof(scale)/sizeof(scale[0]); i++)
40     {
41         if(trans(num, scale[i], str))
42             printf("%5d = %s(%d)\n",num,str,scale[i]);
43         else
44             printf("%5d => (%d) Error!\n",num,scale[i]);
45     }
46     printf("\nPress any key to quit...\n");
47     return 0;
48 }

其他一样种植艺术:将刚整数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 }

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图