剑指offer--打印1到最大的N位数字


题目:输入数字N,按顺序打印出从1到最大的N位十进制数字。


首先需要考虑两点,

一是要考虑大数问题,遇到会溢出的数字仍能满足条件。

二是要满足,按照常规习惯,数字前面的0不输出。


实现:

#include "stdafx.h"
#include <memory>
//用来判断是否达到最大的N位数99^9,当达到的时候会产生最高位进位为1.该种情况返回true

bool Increment(char *number)
{
	bool isOver=false;
	int takeover=0;//进位标示符
	int nLength = strlen(number);
	for(int i = nLength-1;i>=0;i--)
	{
		int nSum = number[i]-'0'+takeover;
		if(i==nLength-1) 
			nSum++;
		if(nSum>=10)
		{
			if(i==0)
				isOver=true;
			else
			{
				nSum-=10;
				takeover=1;
				number[i]=nSum+'0';

			}
		}
		else
		{
			number[i]=nSum+'0';
			break;

		}
	}
	return isOver;
}
void printNumber(char *number)
{
	int i;
	bool isBeginZero=true;
	int nLength = strlen(number);
	for(i=0;i<nLength;i++)
	{
		if(isBeginZero&& number[i]!='0')
			isBeginZero=false;
		if(!isBeginZero)
		{
			printf("%c",number[i]);
		}
	}
	printf("\t");
}

void printToMaxOfDigits(int n)
{
	if(n<=0)
		return;
	char *number = new char[n+1];
	memset(number,'0',n);
	number[n]='\0';
	while(!Increment(number))
	{
					
		printNumber(number);
	}
	delete []number;
}


///递归的解法
void printRecursively(char *number,int length,int index);
void printDigital_v2(int n)
{
	if(n<=0)return;
	char *number = new char[n+1];
	number[n]='\0';
	for(int i=0;i<10;i++)
	{
		number[0]='0'+i;
		printRecursively(number,n,0);
	}

	delete [] number;
}
int main(int argc, char* argv[])
{
	printToMaxOfDigits(3);

	printf("Hello World!\n");
	return 0;
}

void printRecursively(char *number,int length,int index){

	if(index==length-1) 
	{
		printNumber(number);
		return;
	}
	for(int i=0;i<10;i++)
	{
		number[index+1]=i+'0';
		printRecursively(number,length,index+1);

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值