(3)打印1到最大的n位数
2013-11-06 20:41
225 查看
题目描述:输入数字n,顺序打印出1到n位的十进制最大数,例如n = 2,即打印出1 , 2 , 3 ...... 97 , 98 , 99;
思路一:
最大n位十进制数:999.......9999 ,共有n位;易知:其为(
)
循环从1--
输出;但是这里的
为int类型,或者long
long 类型;
但是若n很大时,极易造成溢出;且此题考查的很有可能就是应聘者对大数问题解决办法;
思路二:
利用字符串、数组表示大数;本题在字符串上模拟加法,逐步对每个位置进行赋值;
若输入为n , 则需要n+1长度的字符串Number(最后一位:结束符号'\0')。且Number[i]的取值范围是:'0' -- '9';
若Number[i] < '9' : Number[i] ++
若Number[i] > '9' :Number[i] - 10,向前一位Number[i - 1] 进1
若Number[0] > '9' :则数中的最高位需要向前一位进1,将会出现溢出;(结束条件)
变量:
位数:int n
字符串:char* Number = new char[n + 1]
字符串长度:nLength = strlen(Number)
进位:int TakeOver = 0
溢出:bool OverFlow = false
每位累加:int nSum = Number[ i ] - '0' + TakeOver
思路三:
n位的所有十进制数,每位取值范围0 --- 9 , 那么其就是n位全排列;
首先设置首位的表达范围0---9;然后递归设置后一位0--9;
结束条件:最后一位Number[n - 1] == 9
代码实现:
思路一:
最大n位十进制数:999.......9999 ,共有n位;易知:其为(
)
循环从1--
输出;但是这里的
为int类型,或者long
long 类型;
但是若n很大时,极易造成溢出;且此题考查的很有可能就是应聘者对大数问题解决办法;
思路二:
利用字符串、数组表示大数;本题在字符串上模拟加法,逐步对每个位置进行赋值;
若输入为n , 则需要n+1长度的字符串Number(最后一位:结束符号'\0')。且Number[i]的取值范围是:'0' -- '9';
若Number[i] < '9' : Number[i] ++
若Number[i] > '9' :Number[i] - 10,向前一位Number[i - 1] 进1
若Number[0] > '9' :则数中的最高位需要向前一位进1,将会出现溢出;(结束条件)
变量:
位数:int n
字符串:char* Number = new char[n + 1]
字符串长度:nLength = strlen(Number)
进位:int TakeOver = 0
溢出:bool OverFlow = false
每位累加:int nSum = Number[ i ] - '0' + TakeOver
思路三:
n位的所有十进制数,每位取值范围0 --- 9 , 那么其就是n位全排列;
首先设置首位的表达范围0---9;然后递归设置后一位0--9;
结束条件:最后一位Number[n - 1] == 9
代码实现:
#include<iostream> #include<memory> using namespace std; //--------------------------------------------------------------------------------------------------------------------- bool Increment(char* number); void PrintNumber(char* number); void Print1ToN_Recursion(char* number , int n , int index); //------------------------------------------------------------方法一-------------------------------------------------- //函数参数:整数n //函数功能:按照顺序打印出1--n位最大十进制数 void Print1ToN_Soulation1(int n) { if(n <= 0) return; char* number = new char[n + 1]; number = '\0'; //对number[]初始化:'0' memset(number , '0' , n); while(!Increment(number)) { PrintNumber(number); } delete[] number; } //函数参数:字符串:number[] //函数功能:在表示数字的字符串上加一,实现加法 bool Increment(char* number) { bool OverFlow = false; int takeOver = 0; int nLength = strlen(number); for(int i = nLength - 1; i >= 0; i--) { int nSum = number[i] - '0' + takeOver; if(i == nLength - 1) nSum++; if(nSum >= 10) { if(i == 0) OverFlow = true; else { nSum -= 10; takeOver = 1; number[i] = nSum + '0'; } } else { number[i] = nSum + '0'; break; } } return OverFlow; } //----------------------------------------------方法二---------------------------------------------------------------- //函数参数:整数n //函数功能:按照顺序打印出1--n位最大十进制数 void Print1ToN_Soulation2(int n) { if(n <= 0) return; char* number = new char[n + 1]; number = '\0'; for(int i = 0; i < 10; i++) { number[0] = i + '0'; Print1ToN_Recursion(number , n , 0); } delete [] number; } //函数参数:字符串:number[] , 长度:length , 下标索引:index //函数功能:对number[i] 递归进行赋值(0--9),最终输出number void Print1ToN_Recursion(char* number , int nlength , int index) { if(index == nlength - 1) { PrintNumber(number); return; } for(int i = 0; i < 10; i++) { number[index + 1] = i + '0'; Print1ToN_Recursion(number , nlength , index + 1); } } //函数参数:输出字符串 //函数功能:字符串number[] void PrintNumber(char* number) { bool Ishead = true; int nlength = strlen(number); for(int i = 0; i < nlength; i++) { if(Ishead && number[i] != '0') Ishead = false; if(!Ishead) printf("%c" , number[i]); } printf("\t"); }
相关文章推荐
- 题目1515:打印1到最大的N位数-九度
- 剑指offer_12_打印1到最大的n位数
- 剑指Offer:打印从1到最大的n位数
- 面试题12 打印1到最大的N位数题目
- 从打印1到最大的n位数
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- 面试题12:打印1到最大的n位数
- 剑指Offer 题目1515:打印1到最大的N位数
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 剑指offer-12:打印1到最大的n位数
- 打印1到最大的n位数(递归实现)
- 《剑指offer》面试题17:打印从1到最大的n位数
- 剑指offer---17(打印1到最大n位数)
- 打印1到最大的n位数
- 打印1到最大的n位数
- 【面试题十二】打印1到最大的n位数
- 面试题12:打印1到最大的n位数
- 打印 1 到最大的 n 位数(C++ 和 Python 实现)
- 12 打印1到最大的N位数(递归和非递归解法)
- 剑指Offer----面试题12:打印1到最大的n位数