打印1到最大的n位数
2016-06-17 22:06
218 查看
题目:输入数字n,按顺序打印出从1到最大的n位十进制数。例如,输入3,打印1、2、3......999。
首先我们要考虑大数问题,接下来我们可以用字符串解决大数问题。
解法一:在字符串上模拟数字加法
思路:1、因为数字最大是n位,所以new一个长度为n+1的字符串,字符串最后一位是'\0'。数字不够n位,在字符串前面补0。
2、把字符串中的每一个数字都初始化为'0',然后在字符串表达的数字上模拟加法,最后把字符串表示的数字打印出来。
解法二:数字全排列
我们把数字的每一位从0到9排列一遍,就得到了所有的十进制数。全排列可以采用递归实现,递归结束的条件是设置了数字的最后一位。
首先我们要考虑大数问题,接下来我们可以用字符串解决大数问题。
解法一:在字符串上模拟数字加法
思路:1、因为数字最大是n位,所以new一个长度为n+1的字符串,字符串最后一位是'\0'。数字不够n位,在字符串前面补0。
2、把字符串中的每一个数字都初始化为'0',然后在字符串表达的数字上模拟加法,最后把字符串表示的数字打印出来。
#include<iostream> using namespace std; void Printf(char* num) { bool isBegin0 = true; int len = strlen(num); for (int i = 0; i < len ; ++i) { if (isBegin0 && num[i] != '0') isBegin0 = false; //碰到第一个非0的字符才打印 if (!isBegin0) printf("%c", num[i]); } printf("\t"); } //在表示数字的字符串上加1 bool Incement(char* num) { int step = 0; bool isOverflow = false; int len = strlen(num); for (int i = len - 1; i >= 0; --i) { int sum = num[i] - '0' + step; if (i == len - 1) sum++; if (sum >= 10) { if (i == 0) isOverflow = true; else sum -= 10; step = 1; num[i] = '0' + sum; } else { num[i] = '0' + sum; break; } } return isOverflow; } void PrintfNumber(int n) { if (n <= 0) return; char* num = new char[n + 1];//new一个长度为n+1的字符串 memset(num,'0',n);//字符串中的每一个数字都初始化为'0' num = '\0'; //在字符串表达的数字上模拟加法 while (!Incement(num)) { Printf(num); } delete[] num; } int main() { PrintfNumber(3); return 0; }
解法二:数字全排列
我们把数字的每一位从0到9排列一遍,就得到了所有的十进制数。全排列可以采用递归实现,递归结束的条件是设置了数字的最后一位。
#include<iostream> using namespace std; void Printf(char* num) { bool isBegin0 = true; int len = strlen(num); for (int i = 0; i < len; ++i) { if (isBegin0 && num[i] != '0') isBegin0 = false; if (!isBegin0) printf("%c",num[i]); } printf("\t"); } void PrintfNR(char* num, int len, int index) { if (index == len - 1)//数字的最后一位 { Printf(num); return; } //递归设置数字的每一位,直到数字的最后一位 for (int i = 0; i < 10; ++i) { num[index + 1] = '0' + i; PrintfNR(num,len,index+1); } } void PrintfNumber(int n) { if (n <= 0) return; char* num = new char[n + 1]; num = '\0'; for (int i = 0; i < 10; ++i) { num[0] = '0' + i; PrintfNR(num,n,0); } delete[] num; } int main() { PrintfNumber(3); return 0; }
相关文章推荐
- 面试题3:二维数组中的查找
- 面试题四:替换空格
- 剑指offer第一题
- 剑指Offer 面试题3:二维数组中查找
- 从尾到头打印链表
- 二叉树两个结点的最低公共祖先
- 根据后序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据先序和中序遍历重建二叉树
- 根据后序和中序遍历重建二叉树
- 二叉树两个结点的最低公共祖先
- 《剑指Offer》面试题1:赋值运算符函数
- 剑指offer第三题:二维数组中查找
- 剑指offer 重建二叉树 java实现
- 剑指offer 替换空格 java实现
- 九度 Online Judge 之《剑指 Offer》一书相关题目解答
- 剑指offer 二维数组中的查找
- 剑指offer 调整数组顺序使奇数位于偶数前面
- 【练习笔记】剑指offer-面试题8 :旋转数组的最小数字
- 【练习笔记】剑指offer-变态跳台阶