打印1到最大的n位数
来源:互联网 发布:网络摄像头平台 编辑:程序博客网 时间:2024/06/11 00:04
题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
陷阱:用int或long表示整数时的溢出
方法1:用字符串解决大数问题。
void PrintToMaxOfNDigits(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;}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;}void 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");}
方法2:把数字的每一位从0到9排列一遍,打印时数字排在前面的0不打印就可以。全排列的递归算法是,数字的每一位都可能是0~9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。
void Print1ToMaxOfDigits (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); }}
测试用例:
- 功能测试(输入1、 2、 3)
- 特殊输入测试(输入-1、0)
思考题:用一个char型字符表示十进制数字中的一位。8个bit的char型字符最多能表示256个字符,而十进制数字只有0~9的10个数字。因此用char型字符串来表示十进制的数字并没有充分利用内存,有一些浪费。考虑有没有更高效的方式来表示大数?
相关题目:实现任意两个整数的加法。
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位数
- 算术表达式的计算(基于逆波兰表达式)的c++实现
- 项目中ibatis的isNotNull和isNotEmpty区别
- hadoop查询一条数据
- 面试准备:java Thread详解
- Android中解压zip中文乱码处理
- 打印1到最大的n位数
- C语言-交换
- 利用break和continue窥探空格输入与回车输入
- 面向对象的设计原则
- 因果图实例
- WIN10FTP服务器搭建
- java多线程学习笔记
- 修改tomcat中的字符集问题
- 【bzoj2134】【单选错选】【概率】