/*
初看覺得很水 不過就是個大數麼 但是突然發現很有收穫 就是自己想
*/
#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;
}
劍指offer面試題12 打印從1到最大n位的所有數(大數,遞歸)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.