第三章 高质量的代码 打印1到最大的n位数
来源:互联网 发布:上传淘宝图片尺寸 编辑:程序博客网 时间:2024/04/29 07:07
问题:按照顺序打印出从1到最大n位十进制数。例如输入3,则打印出1,2,3一直到999.
#include "stdafx.h"#include <memory>void PrintNumber(char* number);bool Increment(char* number);void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index);// ====================方法一====================void Print1ToMaxOfNDigits_1(int n){ if(n <= 0) return; char *number = new char[n + 1]; memset(number, '0', n); number[n] = '\0'; while(!Increment(number)) { PrintNumber(number); } delete []number;} // 字符串number表示一个数字,在 number上增加1// 如果做加法溢出,则返回true;否则为false(考虑到大整数溢出的情况)bool Increment(char* number){ bool isOverflow = false; 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) isOverflow = true; else { nSum -= 10; nTakeOver = 1; number[i] = '0' + nSum; } } else { number[i] = '0' + nSum; break; } } return isOverflow;}// ====================方法二(把问题转换成数字排列(n个0-9的全排列)的解法,递归让代码更加简洁)====================void Print1ToMaxOfNDigits_2(int n){ if(n <= 0) return; char* number = new char[n + 1]; number[n] = '\0'; for(int i = 0; i < 10; ++i) { number[0] = i + '0'; Print1ToMaxOfNDigitsRecursively(number, n, 0); } delete[] number;} void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index){ if(index == length - 1) { PrintNumber(number); return; } for(int i = 0; i < 10; ++i) { number[index + 1] = i + '0'; Print1ToMaxOfNDigitsRecursively(number, length, index + 1); }}// ====================公共函数====================// 字符串number表示一个数字,数字有若干个0开头// 打印出这个数字,并忽略开头的0void PrintNumber(char* number){ bool isBeginning0 = true; int nLength = strlen(number); for(int i = 0; i < nLength; ++ i) { if(isBeginning0 && number[i] != '0') isBeginning0 = false; if(!isBeginning0) { printf("%c", number[i]); } } printf("\t");}// ====================测试代码====================void Test(int n){ printf("Test for %d begins:\n", n); Print1ToMaxOfNDigits_1(n); Print1ToMaxOfNDigits_2(n); printf("Test for %d ends.\n", n);}int _tmain(int argc, _TCHAR* argv[]){ Test(1); Test(2); Test(3); Test(0); Test(-1); return 0;}
运行结果如下:
0 0
- 第三章 高质量的代码 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的N位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1到最大的n位数
- 打印1 到最大的n位数
- 打印1到最大的n位数
- Keras一些基本概念
- 51nod 1405 树的距离之和【树型dp】
- 第十三周:C语言:学生成绩
- 1046. Plane Spotting
- javaSE api
- 第三章 高质量的代码 打印1到最大的n位数
- 快速幂取模算法
- php jpgraph的中文乱码问题及解决方法
- Java web开发效率提升
- Block Chain --- (0) Intro
- c# reflection的作用
- scala集合函数式编程使用示例
- iOS开发- 如何查看崩溃信息
- Python实现简单的WEB服务器