且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

剑指Offer之打印1到最大的n位数(题12)

更新时间:2022-10-04 15:18:29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
 /****************************************                                                                                                 
  2     > File Name:test.c
  3     > Author:xiaoxiaohui
  4     > mail:1924224891@qq.com
  5     > Created Time:2016年05月26日 星期四 15时31分00秒
  6 ****************************************/
  
  
  
 10 
 11 
 12 //此题的关键是解决大数问题,在这里我用字符数组解决大数的存储
 13 //在字符数组的最后一位存的是最低位,依次往前推,加1是在最低位加的
 14 //当低位为9时,加1会发生进位,所以进到高位时要先加1,所以要设置进位标志
 15 //当最高位发生进位时,则表示到了最大的数
 16 
 17 
 18 #include<stdio.h>
 19 
 20 void Print(char* buf)
 21 {
 22     int size = sizeof(buf);
 23 
 24     for(int i = 0; i < size; i++)      //使buf指向第一个不为‘0’的字符
 25     {
 26         if(buf[i] == '0')
 27         {
 28             buf++;
 29         }
 30         else
 31         {
 32             break;
 33         }
 34     }
 35 
 36     printf("%s\t", buf);
 37 }
 38 
 39 int isBiggest(char* buf)
 40 {
 41     int flog = 0;
 42     int size  = sizeof(buf);
 43     int over_flog = 0;        //进位标志
 44     int i = 0;
 45 
 46     for(i = size - 1; i >= 0; i--)
 47     {
 48         int sum = buf[i] - '0' + over_flog;   //把最i位的值取出来
 49         if(i == size - 1)     //当是最低位时,则在这一位上加1
 50         {
 51             sum += 1;
 52         }
 53 
 54         if(sum >= 10)     //产生进位
 55         {
 56             if(i == 0)    //当最高位要进位了,就代表已经是最大值了
 57             {
 58                 flog = 1;
 59             }
 60             else
 61             {
 62                 buf[i] = '0';    //这一位要变为0                                                                                          
 63                 over_flog = 1;   //高一位的要加1
 64             }
 65         }
 66         else               //不需要进位
 67         {
 68             buf[i] = '0' + sum;
 69             break;
 70         }
 71 
 72         return flog;
 73     }
 74 }
 75 
 76 
 77 void PrintToMax(int n)
 78 {
 79     if(n <= 0)
 80     {
 81         printf("parameter is error!\n");
 82         return;
 83     }
 84 
 85     char* buf = (char*)melloc( (n + 1) * sizeof(char));
 86     memset(buf,'0',sizeof(buf));
 87     buf[n] = '\0';
 88 
 89     while( !isBiggest(buf))
 90     {
 91         Print(buf);
 92     }
 93 
 94     free(buf);
 95 }
 96


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/****************************************                                                                                                 
  2     > File Name:test1.c
  3     > Author:xiaoxiaohui
  4     > mail:1924224891@qq.com
  5     > Created Time:2016年05月26日 星期四 16时44分54秒
  6 ****************************************/
  
  8 #include<stdio.h>
  
 10 
 11 void Print(char* buf)
 12 {
 13     int size = sizeof(buf);
 14 
 15     for(int i = 0; i < size; i++)      //使buf指向第一个不为‘0’的字符
 16     {
 17         if(buf[i] == '0')
 18         {
 19             buf++;
 20         }
 21         else
 22         {
 23             break;
 24         }
 25     }
 26 
 27     printf("%s\t", buf);
 28 }
 29 
 30 void PrintDigit(char* buf, int length, int index)
 31 {
 32     if(index == length)
 33     {
 34         Print(buf);
 35         return;
 36     }
 37 
 38     for(int i = 0; i < 10; i++)
 39     {
 40         buf[index] = '0' + i;
 41         PrintDigit(buf, length, index + 1);
 42     }
 43 }
 44 
 45 void PrintToMax(int n)
 46 {
 47     if(n <= 0)
 48     {
 49         printf("parameter is error!\n");
 50         return;
 51     }
 52 
 53     char* buf = (char*)melloc(size(char) * (n + 1));
 54     memset(buf, '0'sizeof(buf));
 55     buf[n] = '\0';
 56 
 57     for(int i = 0; i < 10; i++)
 58     {
 59         PrintDigit(buf, n, 0);
 60     }
 61 }









本文转自 ye小灰灰  51CTO博客,原文链接:http://blog.51cto.com/10704527/1783641,如需转载请自行联系原作者