剑指Offer 面试题12:打印1到最大的N位数 题解

剑指Offer 面试题12:打印1到最大的N位数


九度OJ 1515 提交网址: http://ac.jobdu.com/submitpage.php?pid=1515&sid=1539822

牛客OJ:未收录

题目描述:

给定一个数字N,打印从1到最大的N位数。

输入:

每个输入文件仅包含一组测试样例。
对于每个测试案例,输入一个数字N(1<=N<=5)。

输出:

对应每个测试案例,依次打印从1到最大的N位数。

样例输入:
1

样例输出:
1
2
3
4
5
6
7
8
9


分析:

  此题在OJ里完全没有陷阱,就是从1~99...9全部输出一遍,因为位数n是规定好了的。但如果是面试中面试官故意不告诉你n的范围,那就是等着机会坑你的。对于int和long long范围内。能直接用单个变量解决;如果位数多了,就需要用高精度算法。其他的就不需要多说了,对于大数的加1输出等等操作都要自己写函数完成。


纯C语言代码 竟然可以直接AC:
#include<stdio.h>
 
int main()
{
    int i;
    int n, N;
     
    while(scanf("%d", &n) == 1 && n>=1 &&n<=5)
    {
        N = 1;
        for(i = 0; i < n; ++i){
            N *= 10;
        }
        --N;
        for(i = 1; i <= N; ++i){
            printf("%d\n", i);            // 此代码中没使用高效的算法,将较慢的cout换成printf可以省时
        }
    }    
    return 0;
}
/**************************************************************
    Problem: 1515
    Language: C
    Result: Accepted
    Time:40 ms
    Memory:912 kb
****************************************************************/

内存 912 kb  耗时 40 ms


编程基础回顾:

1. C语言中的 scanf 函数是有返回值的,它的返回值可以分成三种情况:
  1) 正整数,表示正确输入参数的个数。例如执行 scanf("%d %d", &a, &b);
      如果用户输入"3 4",可以正确输入,返回2(正确输入了两个变量);
      如果用户输入"3,4",可以正确输入a,无法输入b,返回1(正确输入了一个变量)。
  2) 0,表示用户的输入不匹配,无法正确输入任何值。如上例,用户如果输入",3 4",返回0。
  3) EOF,这是在stdio.h里面定义的常量(通常值为-1),表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复2次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。

所以可以使用下面的代码来处理输入:
while (scanf("%s %c %c", str, &oldchar, &newchar) == 3) /* 或!= EOF , 但前者更好 */
{
    ; //处理
}

2. 为什么前面 scanf 的格式串里面,%s和%c中间需要空格呢?
  那是因为如果没空格的话。。。oldchar输入的就是空格了= =.

3. 顺便说一下,printf的返回值是输出的字符数,例如,printf("1234")的返回值是4,而printf("1234\n")的返回值是5。


建议:你可能已经听说过很多次了,在OJ上做题尽量使用scanf和printf,尤其是有大量数据需要输入输出时,尽量避免使用cout.


当然,写成下面这样也可以:

#include<stdio.h>
#include<iostream>
using namespace std;
 
int main()
{
    int i;
    int n, N;
     
    while(cin>>n && n>=1 &&n<=5)
    {
        N = 1;
        for(i = 0; i < n; ++i){
            N *= 10;
        }
        --N;
         
        for(i = 1; i <= N; ++i){
            printf("%d\n", i);
        }
    }    
    return 0;
}
/**************************************************************
    Problem: 1515
    Language: C++
    Result: Accepted
    Time:40 ms
    Memory:1520 kb
****************************************************************/



其他高效算法 相关链接:

http://blog.csdn.net/gatieme/article/details/51132108

http://blog.csdn.net/ns_code/article/details/25562105


你可能感兴趣的:(剑指Offer 面试题12:打印1到最大的N位数 题解)