剑指offer 面试题12 打印1到n位整数的最大值

<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);
}



                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值