<pre name="code" class="cpp">#include <iostream>
#include <cstring>
using namespace std;
//接收字符串,加1,判断是否溢出
//方法1:找到第一个不等于9的数字下标,将其加1,并将之后的位都置0
bool increment(char* number){
bool overflow=false;
//flag是第一个不等于9的数字下标,从后往前找
int flag=strlen(number)-1;
while(flag>=0&&number[flag]=='9'){
--flag;
}
if(flag<0){
overflow=true;
}
else{
number[flag]=number[flag]+('1'-'0');
for(int i=flag+1;i<strlen(number);++i){
number[i]='0';
}
}
return overflow;
}
//方法2:朴素加法算法
//分别对每一位操作,设置一个保存进位的变量
bool increment2(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;
}
//接收数字,开头的0不输出
void print(char* number){
//flag是第一个不等于0的数字下标,从前往后找
int flag=0;
while(flag<strlen(number)&&number[flag]=='0'){
flag++;
}
for(int j=flag;j<strlen(number);++j){
cout<<number[j];
}
cout<<' ';
}
//接收n,输出所有数字
void Print1ToMaxN(int n){
if(n<=0) return;
char* number=new char [n+1];
number[n]='\0';
memset(number,'0',n);
while(!increment(number)){
print(number);
//cout<<number<<' ';
}
delete []number;
}
//方法3:每一位都做一次0~9的全排列
//全排列问题->递归法
void Print1ToMaxN_Recursion_core(char* number,int n,int index){
if(index==n){
print(number);
return;
}
for(int i=0;i<10;++i){
number[index]=i+'0';
Print1ToMaxN_Recursion_core(number,n,index+1);
}
}
void Print1ToMaxN_Recursion(int n){
if(n<=0) return;
char* number=new char[n+1];
number[n]='\0';
Print1ToMaxN_Recursion_core(number,n,0);
delete []number;
}
int main(){
int n=3;
Print1ToMaxN(n);
Print1ToMaxN_Recursion(n);
}
剑指offer 面试题12 打印1到n位整数的最大值
最新推荐文章于 2020-10-28 21:59:05 发布