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

简介:
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,如需转载请自行联系原作者
目录
相关文章
|
4月前
剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
剑指Offer LeetCode 面试题17. 打印从1到最大的n位数
22 0
|
9月前
|
C语言
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
C语言实例:求水仙花数(阿姆斯壮数)和回文数(附带求一串数字的位数方法和每一位数字的计算方法)
97 0
|
9月前
【蓝桥杯】1434:回文数字—>三种判断回文的方法(下)
【蓝桥杯】1434:回文数字—>三种判断回文的方法(下)
41 0
|
9月前
【蓝桥杯】1434:回文数字—>三种判断回文的方法(上)
【蓝桥杯】1434:回文数字—>三种判断回文的方法
79 0
|
10月前
|
存储 算法 Java
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
leetcode刷题记录:7.整数反转,8.字符串转整数,9.回文数
39 0
|
10月前
|
算法 安全 Swift
LeetCode - #9 判断回文数字
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
10月前
|
存储
剑指Offer - 面试题17:打印从1到最大的n位数
剑指Offer - 面试题17:打印从1到最大的n位数
47 0
|
10月前
剑指offer 19. 表示数值的字符串
剑指offer 19. 表示数值的字符串
28 0
|
11月前
|
算法 C++
C/C++每日一练(20230512) 成绩打印、补齐数组、水仙花数
C/C++每日一练(20230512) 成绩打印、补齐数组、水仙花数
101 0
【C语言】(错题整理) 寻找完数、字符串中各类字符数的统计、最大公约数和最小公倍数、回文数计算 (循环、函数相关内容)
本篇博客旨在整理最近在头歌遇到的难题、错题,对其进行分析并整理。 一、循环 1.寻找完数(计算因子例题) 一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。 这道题的首要任务就是找到各个数的因子,然后再对其进行判断。那么计算这个数的因子,我们可以用循环,试每个小于它的数对其进行求余%,结果为零即是因子。