劍指offer面試題12 打印從1到最大n位的所有數(大數,遞歸)

/*
初看覺得很水  不過就是個大數麼 但是突然發現很有收穫 就是自己想
*/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

bool NumberAdd(char * num)//不是最後一個數返回0 繼續加 否則返回1 表示到了頭
{
    bool isOverflow= false;//判斷是不是到了最後一個數字 只要看最高位是不是有進位
    int len=strlen(num);
    int nTakeOver=0;//表示 在加目前的位後是否有進位
    for(int i=len-1;i>=0;--i)
    {
        int inum=num[i]-'0'+nTakeOver;
        if(i==len-1)//因爲每次加1 只有在個位才加1
        inum++;
        if(inum<10)
        {
            num[i]='0'+inum;
            break;
        }
        else
        {
            if(i==0)//到了 第一位 就是數字的最大位又有了進位
                isOverflow=true;
            else
            {
                nTakeOver=1;
                num[i]='0';
            }
        }
    }
    return isOverflow;
}
//其實根本不用寫這個函數 puts 函數自帶的這個功能....
void PrintNumber(char * num)//這個函數主要就是 找到第一個不是0的位置
{
    int i=0;
    while(num[i]=='0')
    i++;
    int len=strlen(num);
    while(i<len)
    printf("%c",num[i++]);
    printf("\t");
}

void PrintOneToMaxOfN(int n)
{
    char  * num=new char [n+1];
    memset(num,'0',n);//一直以爲這個函數之能賦值0 和1 但是在字符串可以賦具體的字符

    num[n]='\0';

    while(!NumberAdd(num))
    {
        PrintNumber(num);
    }
    delete [] num;
}
//其實這道題 主要要學習的地方就在這兒 一直遞歸都寫的不好。。這裏傳遞的這個index想法最重要
void PrintRecursively(char * num,int len,int index)
{
    if(index==len)
    {
        PrintNumber(num);
        return ;
    }
    for(int i=0;i<10;++i)
    {
        num[index]='0'+i;
        PrintRecursively(num,len,index+1);
    }
}
//方法二 用遞歸
void PrintOneToMaxOfN2(int n)
{
    if(n<1)
    return ;
    char * num=new char [n+1];
    num[n]='\0';
    for(int i=0;i<10;++i)
    {
        num[0]='0'+i;
        PrintRecursively(num,n,1);
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
        //PrintOneToMaxOfN(n);
        PrintOneToMaxOfN2(n);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章