前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++版 - 剑指Offer 面试题12:打印1到最大的N位数 题解

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

作者头像
Enjoy233
发布2019-03-05 14:15:03
5380
发布2019-03-05 14:15:03
举报
文章被收录于专栏:大白技术控的技术自留地

剑指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:

代码语言:javascript
复制
#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.

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

代码语言:javascript
复制
#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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年05月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档