打印1到最大的n位数

来源:互联网 发布:网易邮mac 编辑:程序博客网 时间:2024/05/14 12:04

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

解答:这里打印1到n位最大的数,当n变大的时候,无法用int存储,所以本题就是大数问题。考虑用字符串存储。

bool Increment(char *num){int increment=0;  //进位int length=strlen(num);for(int i=length-1;i>=0;i--){int value=num[i]-'0'+increment;if(i==length-1)value++;if(value==10)  //该位加到最大及9{if(i==0)  //加到最大的n位数字,返回。return false;else{increment=1;value=0;num[i]='0';}}else{num[i]='0'+value;break;}}return true;}void Print(char *num){int length=strlen(num);int i=0;while(num[i]=='0')i++;for(int j=i;j<length;j++)cout<<num[j];cout<<'\t';}int main(){int n;cin>>n;if(n<=0)return 0;char *num=new char[n+1];for(int i=0;i<n;i++)num[i]='0';num[n]='\0';while(Increment(num))Print(num);delete []num;return 0;}

以下是递归算法,就是输出n位数字的全排列。

void Print(char *num){int n=strlen(num);int i=0;while(num[i]=='0')i++;for(int j=i;j<n;j++)cout<<num[j];cout<<'\t';}void Print2(char *num,int length,int index){if(index==length-1){Print(num);return;}for(int i=0;i<10;i++){num[index+1]=i+'0';Print2(num,length,index+1);}}void Print1(int n){if(n<=0)return;char *num=new char[n+1];num[n]='\0';for(int i=0;i<10;i++){num[0]='0'+i;Print2(num,n,0);}delete [] num;}int main(){int n;cin>>n;Print1(n);return 0;}

0 0