剑指Offer_面试题12_打印1到最大的n位数
2017-07-17 15:06
225 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数即999。
陷阱:这个题目看似简单,我们先求出最大的n位数,然后for循环从1开始打印。
民工解法:模拟字符串加法,绕过陷阱。为了保存n为数字我们需要一个n+1长度的字符串,且初始化为'0',末尾置为'\0'。主要完成两个功能:模拟加法、打印数字。
民工解法2:递归,数字全排列 n位所有十进制数字其实都是n个从0到9的全排列,也就是说把每一位从0到9排列一遍,就能得到所有十进制数。
陷阱:这个题目看似简单,我们先求出最大的n位数,然后for循环从1开始打印。
void PrintToMax(int n) { int number = i; int i = 0; while(i++ < 10) number *= 10; for(i = 1; i < number; ++i) printf("%d\t", i); }乍看没啥毛病,但如果仔细分析会发现面试官并没有指定n的范围。当n输入很大的时候,最大的n位数用int或者long long会不会都要溢出?这也就是要考虑大数问题。陷阱,赤果果的陷阱。
民工解法:模拟字符串加法,绕过陷阱。为了保存n为数字我们需要一个n+1长度的字符串,且初始化为'0',末尾置为'\0'。主要完成两个功能:模拟加法、打印数字。
#include <stdio.h> #include <stdlib.h> #include <string.h> bool Increment(char *number) { int nTakeOver = 0; int nLength = strlen(number); for (int i = nLength - 1; i >= 0; --i) { int nSum = number[i] - '0' + nTakeOver; if (i == nLength - 1) ++nSum; if (nSum >= 10) { if (i == 0) //判段加到最大数值了。此时number已经修改,但不打印最后一个“越界的数值” return true; else { nSum -= 10; nTakeOver = 1; number[i] = '0' + nSum; } } else { number[i] = '0' + nSum; break; } } return false; } void PrintNumber(char *number) { while (*number == '0') { number++; } printf("%s\t", number); }
民工解法2:递归,数字全排列 n位所有十进制数字其实都是n个从0到9的全排列,也就是说把每一位从0到9排列一遍,就能得到所有十进制数。
void Print(char *number) //输出字符串 { while (*number == '0') { number++; } printf("%s ", number); } void PrintRecur(char *number, int n, int index) //全排列的方式 { int i = 0; if (index == n) //从最后一个字符开始排列,如果排列到第一个字符就打印出来 { Print(number); return; } for (i = 0; i<10; i++) { number[index] = i + '0'; //控制这个字符串中的每个字符从0~9的变化 PrintRecur(number, n, index + 1); } }扩展题大数加法等实现了在补充,现在卡在加负数上面。
相关文章推荐
- 剑指Offer面试题12(Java版):打印1到最大的n位数
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
- 剑指offer——面试题12:打印1到最大的n位数
- 剑指Offer学习之面试题12 :打印1 到最大的n 位数
- 剑指offer面试题12:打印1到最大的n位数(1)
- 剑指offer面试题12-打印1到最大的n位数
- 剑指offer-面试题12:打印1到最大的n位数
- 《剑指Offer》学习笔记--面试题12:打印1到最大的n位数
- 《剑指Offer》面试题12:打印1到最大的n位数
- 剑指Offer面试题12[打印1到最大的n位数]
- 剑指offer面试题12:打印1到最大的n位数
- 剑指Offer 面试题12:打印1到最大的N位数 题解
- 剑指Offer-面试题12:打印1到最大的n位数
- (剑指Offer)面试题12:打印1到最大的n位数
- 剑指offer面试题12 使用BigInteger来实现 打印1到最大的n位数
- 剑指offer-面试题12.打印1到最大的n位数
- 《剑指Offer》面试题12:打印1到最大的n位数
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 面试题12:打印1到最大的n位数
- 剑指Offer之面试题12:打印1到最大的N位数