剑指Offer10 打印1到最大n位数

  1 /*************************************************************************
  2     > File Name: 10_PrintToMaxNum.c
  3     > Author: Juntaran
  4     > Mail: [email protected]
  5     > Created Time: 2016年08月30日 星期二 00时47分36秒
  6  ************************************************************************/
  7
  8 #include <stdio.h>
  9 #include <malloc.h>
 10 #include <string.h>
 11
 12
 13 void PrintNumber(char* number)
 14 {
 15     bool isBeginning0 = true;
 16     int length = strlen(number);
 17
 18     for (int i = 0; i < length; ++i)
 19     {
 20         if (isBeginning0 && number[i]!=‘0‘)
 21             isBeginning0 = false;
 22
 23         if (!isBeginning0)
 24             printf("%c", number[i]);
 25     }
 26     printf("\t");
 27 }
 28
 29
 30 bool Increment(char* number)
 31 {
 32     bool isOverflow = false;
 33     int length = strlen(number);
 34     int TakeOver = 0;
 35
 36     for (int i = length-1; i >= 0; i--)
 37     {
 38         int sum = number[i] - ‘0‘ + TakeOver;    // 进位
 39         if (i == length - 1)
 40             sum ++;
 41
 42         if (sum >= 10)
 43         {
 44             if (i == 0)
 45                 isOverflow = true;
 46             else
 47             {
 48                 sum -= 10;
 49                 TakeOver = 1;
 50                 number[i] = sum + ‘0‘;
 51             }
 52         }
 53         else
 54         {
 55             number[i] = sum + ‘0‘;
 56             break;
 57         }
 58     }
 59     return isOverflow;
 60 }
 61
 62 // 从1打印到最大的n位数
 63 void PrintToMaxNum1(int n)
 64 {
 65     if (n <= 0)
 66         return;
 67
 68     char* number = (char*)malloc(sizeof(char)*(n+1));
 69     memset(number, ‘0‘, n);
 70     number[n] = ‘\0‘;
 71
 72     while (!Increment(number))
 73     {
 74         PrintNumber(number);
 75     }
 76     free(number);
 77 }
 78
 79
 80 /************************************************************************/
 81 // 递归写法
 82 void PrintToMaxNumRecursively(char* number, int length, int index)
 83 {
 84     if (index == length-1)
 85     {
 86         PrintNumber(number);
 87         return;
 88     }
 89     for (int i = 0; i < 10; ++i)
 90     {
 91         number[index+1] = i + ‘0‘;
 92         PrintToMaxNumRecursively(number, length, index+1);
 93     }
 94 }
 95
 96 void PrintToMaxNum2(int n)
 97 {
 98     if (n <= 0)
 99         return;
100
101     char* number = (char*)malloc(sizeof(char)*(n+1));
102     number[n] = ‘\0‘;
103
104     for (int i = 0; i < 10; ++i)
105     {
106         number[0] = i + ‘0‘;
107         PrintToMaxNumRecursively(number, n, 0);
108     }
109     free(number);
110 }
111
112
113 int main()
114 {
115     int n = 5;
116     PrintToMaxNum1(n);
117     PrintToMaxNum2(n);
118 }
时间: 2024-08-26 00:31:46

剑指Offer10 打印1到最大n位数的相关文章

剑指offer——打印从1到最大的n位数

因为unsigned int甚至unsigned long类型不一定能表示很大的n位数,它们的表示范围是一定的,所以可以使用字符串来存储,并打印 bool Incerment(char*& str,int n)//每次调用这个函数都会对字符串进行数值的加1 {     int index = n-1;     int tmp = str[index] - '0' + 1;     int offset = 0;     while (index>0){//如果index==0则表示已经超出了

剑指offer10

package jianzhiOffer; /**  * 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.  * 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?  * @author user  *  */ public class ch10 { public static int methodNumber(int n) { if(n <= 0) { return 0; } else if(n == 1) { return 1; } else if(n == 2

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

剑指OFFER之顺时针打印矩阵(九度OJ1391)

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行包括两个整数m和n(1<=m,n<=1000):表示矩阵的维数为m行n列. 接下来的m行,每行包括n个整数,表示矩阵的元素,其中每个元素a的取值范围为(1&l

剑指OFFER之打印1到最大的N位数(九度OJ1515)

题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例.对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1到最大的N位数. 样例输入: 1 样例输出: 1 2 3 4 5 6 7 8 9 解题思路: 直接通过n快速指定比最大的那个数大1的数,10,100,1000,10000,100000.... 输出,就行了... 代码: #include <stdio.h> int main(void){ int

剑指offer (20) 打印螺旋矩阵

题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; int nRows = matrix.size(); if (nRows == 0) return result; int nCols = matrix.at(0).size()

剑指offer (12) 打印1到最大的n位数

题目描述: 给定一个数字N,打印从1到最大的N位数 此题需要注意以下几点: 1. 涉及到大数问题,因为并没有限定 n的取值范围,所以需要采取 字符数组模拟大数运算 2. 打印数字时 需要忽略前置0 3. 我们始终 以n位数为整体,n位所有十进制数其实是 n位从0到9的全排列,可以采用递归解决 我们从 数组下标0开始 (对应于数字最高位),每一位都有0到9取值,然后设置下一位,递归的结束条件是 设置位到了数组的最末端 1 void PrintNum(char* num) 2 { 3 char* c

【剑指offer】Q5:从尾到头打印链表

可以练习下链表的逆置. def PrintListReversingly(head): if head == None: return if head: PrintListReversingly(head.next) print head.val def reverse(head): if head == None or head.next == None: return head psuhead = ListNode(-1) while head: nexthead = head.next h