剑指Offer 面试题12:打印1到最大的N位数 题解
2016-05-03 15:50
477 查看
剑指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:
内存 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.
当然,写成下面这样也可以:
其他高效算法 相关链接:
http://blog.csdn.net/gatieme/article/details/51132108
http://blog.csdn.net/ns_code/article/details/25562105
九度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
相关文章推荐
- 程序员的十个层次,你属于哪一层?(转)
- java面试常遇到的(2)
- 职业规划2
- 程序员的hello world
- 一个合格的程序员应该读过哪些书
- 奋斗吧,程序员——第二十四章 想佳人、妆楼凝望,误几回、天际识归舟
- 关于ArrayList的5道面试题
- 剑指offer-面试题36-数组中的逆序对(O(n)复杂度)
- 职场黑话
- 程序员要注意的细节
- leetcode 8: String to Integer (myAtoi,C库函数atoi模拟) (剑指offer 面试题49) 解题报告
- 面试杂谈
- 程序员的开始
- 如何做成牛x,简历吸引人,月薪3万,程序员的品牌
- 程序员的成长阶梯和级别[转]
- 程序员菜鸟逆袭,英语学习之路(版本v.1.1)
- 奋斗吧,程序员——第二十三章 正是江南好风景,落花时节又逢君
- Android 面试精华题目总结
- 程序员的成长阶梯和级别定义
- 程序员的成长阶梯和级别定义