打印1到最大的n位数

题目:输入数字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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值