剑指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* cur = num;
4 while (*cur == ‘0‘) {
5 ++cur;
6 }
7 if (cur != num + strlen(num)) {
8 fprintf(stdout, "%s\n", cur);
9 }
10 }
11
12 void Print(char* num, int len, int index)
13 {
14 if (index == len) {
15 PrintNum(num);
16 return;
17 }
18
19 for (int i = 0; i < 10; ++i) {
20 num[index] = i + ‘0‘;
21 Print(num, len, index + 1);
22 }
23 }

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

时间: 2024-11-11 14:09:16

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

剑指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】打印1到最大的n位数

题目:输入数字n,按顺序打印出从1最大的n位十进制数.比如输入3,则打印出1,2,3一直到最大的3位数即999. 此题很容易误入陷阱! //第一次解法,不幸调入陷阱 void print(int n) { if (n<1) { printf("Invalid Input!\n"); return; } long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出 for (int i=0; i<maxNum; i++) { pri

剑指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的个数

题目 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路 把一个整数减去1,再和原整数做与运算,会把整数最右边一个1变成0.那么一个整数的二进制表示中有多少个1,就可以进行多次这样的操作. 代码 /*--------------------------------------- * 日期:2015-07-20 * 作者:SJF0115 * 题目: 12.二进制中1的个数 * 结果:AC * 网址:http://www.nowcoder.com/books/coding-int

剑指offer 顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路:一定要记住循环继续的条件是columns > start * 2,rows > start * 2; 一圈的打印分为四步: 第一步:无条件打印第一行,从左往右: 第二步:终止行号大于起始行号,打印最后一列,从上往下: 第

剑指offer顺时针打印矩阵python

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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. 思路 分别给行和列设置两个数字作为边界值,每一次循环之后,缩小边界. 代码 # -*- coding:utf-8 -*- class Solution: # matrix类型为二维列表,需要返回列表 def print

剑指Offer之打印从1到最大的n位数

基本思路 第一种方法:当我们只有对9999或者999或者99或9加1的时候,才会在第一个数字的基础上产生进位,而其他所有情况都不好在第一个数字上产生进位.因此当我们发现在加1的时候第一个数字产生了进位,则已经是最大的n位数,此时increment返回true,循环终止.代码如下: public class Print1ToMaxOfDigits { public static void main(String[] args) { Scanner sc = new Scanner(System.i

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

题目:输入数字n,按顺序从1打印到最大的n位十进制数.例如,输入3,则打印1, 2, 3, ..., 999 def printToMaxOfNDigits(n): """ 打印1, 2, ..., 99999(n个9) 可以从1开始然后用大数加法加到n个9,也可以使用递归方法实现 """ def helper(idx): # 递归出口就是设置完最后一位 if idx == n - 1: for j in range(n): if number[

剑指Offer 12. 数值的整数次方 (其他)

题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 题目地址 https://www.nowcoder.com/practice/1a834e5e3e1a4b7ba251417554e07c00?tpId=13&tqId=11165&tPage=1&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-