剑指offer11:打印1到最大的n位数

本文介绍了两种打印从1到最大n位数的方法。一种是通过递增方式更新字符串中的数字,另一种是采用循环全排列法,递归生成所有可能的n位数,并排除前导零的情况。

题目:输入数字n,按顺序打印出从1最大的n位十进制。比如输入3,则打印1、2、3一直到最大的3位数999.

一、循环版本

#include <iostream>
#include <list>
#include <algorithm>
#include <time.h>
#include <string.h>
#define MAX 1000
#define N 30
using namespace std;

void print(char *a,int n);

void solution(int n){
    char *number = new char[n];
    memset(number,'0',n);
    int i = n-1;
    while((number[0]-'0')<10){
       if(number[i]-'0'>=10){
            number[i]='0';
            ++number[--i];
             print(number,n);
       }
       else{
            i=n-1;
            ++number[i];
            if(number[i]-'0'<10)
                print(number,n);
       }
    }

}
void print(char *a,int n){
    for(int i=0;i<n;++i){
        cout<<a[i];
    }
     cout<<"-";
}
int main()
{
    pre(2);
    return 0;
}

二、循环全排列法

#include <iostream>
#include <list>
#include <algorithm>
#include <time.h>
#include <string.h>
#define MAX 1000
#define N 30
using namespace std;

void print(char *a,int n);
void sol(char *data,int index,int elem,int n){
   // cout<<index<<"-";
    if(index==n-1){
         data[index] = elem+'0';
        print(data,n);
       return;
    }
    data[index] = elem+'0';
    for(int i=0;i<10;++i){
        sol(data,index+1,i,n);
    }
}
void print(char *a,int n){
    int index = 0;
    while(a[index]-'0'==0)index++;
    for(int i=index;i<n;++i){
        cout<<a[i];
    }
    cout<<" ";
}
int main()
{
    int n=3;
    char *a = new char[n];
    memset(a,'0',n);
    for(int i=0;i<10;++i){
        sol(a,0,i,n);
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/lwhcs/p/5713662.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值