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

来源:互联网 发布:重庆网络刷票投票公司 编辑:程序博客网 时间:2024/05/22 10:45
<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
原创粉丝点击