题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999.
解题思路:此题需要考虑大数问题,n位数用整型(int)或者长整型(long long)容易溢出。常用的解决办法是用字符串或者数组来表达大数。以下我们采用字符串来解决大数问题。可以发现n位所有十进制数其实就是n个从0到9的全排列,即把数字的每一位都从0到9排列一遍,就得到了所有的十进制数。只是在打印的时候,数字排在前面的0我们不打印出来。这种全排列采用递归的方式很容易表达。代码如下:
#include<iostream>
using namespace std;
void PrintMaxNDigits(int n);
void PrintToMaxNDigits(char *number,int index);
void PrintNumber(char *number);
void main()
{
PrintMaxNDigits(2);
}
//n位上的0-9的全排列问题
void PrintMaxNDigits(int n)
{
if(n<=0)
return;
char *number=new char[n+1];
number[n]='\0';
for(int i=0;i<10;i++)
{
number[0]=i+'0';
PrintToMaxNDigits(number,0);
}
delete []number;
}
//递归的过程
void PrintToMaxNDigits(char *number,int index)
{
int len=strlen(number);
if(index==len-1)//递归终止条件
{
PrintNumber(number);//打印出当前的数字
return;
}
for(int i=0;i<10;i++)
{
number[index+1]=i+'0';
PrintToMaxNDigits(number,index+1);
}
}
//输出
void PrintNumber(char *number)
{
int len=strlen(number);
bool tag=true;
for(int i=0;i<len;i++)
{
if(tag&&number[i]!='0')//高位为0的不输出
tag=false;
if(!tag)
cout<<number[i];
}
if(!tag)
cout<<endl;
}
拓展:定义一个函数,实现任意两个整数的加法。由于没有限定输入两个数的大小范围,我们也要把它当做大数问题来处理。同样采用字符串来保存加数。
解题思路:栈1用来保存加数1,栈2用来保存加数2,两个加数分别入栈,结束后栈顶均为最低位。栈3用来记录加数之后的结果,栈1和栈2分别出栈,两个数相加保存进位,余下的入栈,直到栈1和栈2都为空。栈3出栈即为相加后的整数。代码如下:
#include<iostream>
#include<stack>
using namespace std;
char *AddTwoDigits(char *num1,char *num2);
void main()
{
cout<<AddTwoDigits("9","1")<<endl;
}
char *AddTwoDigits(char *num1,char *num2)
{
int len1=strlen(num1);
int len2=strlen(num2);
stack<int> s1;//栈1
stack<int> s2;//栈2
stack<int> s3;//栈3,用来保存结果
for(int i=0;i<len1;i++)//加数1入栈,结束后栈顶为最低位
s1.push(num1[i]-'0');
for(int i=0;i<len2;i++)//加数2入栈,结束后栈顶为最低位
s2.push(num2[i]-'0');
int sum=0;
//cout<<len1<<" "<<s1.size()<<endl;
//cout<<len2<<" "<<s2.size()<<endl;
while(!s1.empty()&&!s2.empty())
{
sum+=s1.top()+s2.top();
s3.push(sum%10);//两个数的和进栈
sum=sum/10;//进位的值
s1.pop();
s2.pop();
}
while(!s1.empty())
{
sum+=s1.top();
s3.push(sum%10);
sum=sum/10;
s1.pop();
}
while(!s2.empty())
{
sum+=s2.top();
s3.push(sum%10);
sum=sum/10;
s2.pop();
}
if(sum)
s3.push(sum);
int len=s3.size();
char *res=new char[len+1];
res[len]='\0';
char base='0';
for(int i=0;i<len;i++)
{
res[i]=base+s3.top();
s3.pop();
}
return res;
}