输入数字n,顺序打印出1到n位的十进制最大数

来源:互联网 发布:美少女梦工厂 mac 编辑:程序博客网 时间:2024/04/28 21:40

转自:点击打开链接

题目描述:输入数字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

#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[n] = '\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[n] = '\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),最终输出numbervoid 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");}


0 0
原创粉丝点击