码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指offer】打印1到最大的n位数

时间:2015-05-12 00:11:43      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:刷题   c++   

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

此题很容易误入陷阱!

//第一次解法,不幸调入陷阱
void print(int n)
{
	if (n<1)
	{
		printf("Invalid Input!\n");
		return;
	}
	long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出
	for (int i=0; i<maxNum; i++)
	{
		printf("%d ",i);
	}
}
显然上面的解法不能让人满意。

在字符串上模拟数字加法的解法,绕过陷阱!

//字符串number表示一个数字,在number上加1,如果溢出返回true,否则返回false
bool Increase(char *number)
{
	bool isOverflow=false;
	//记录进位
	int ntakeOver=0;
	//数字的长度
	int len=strlen(number);
	for (int i=len-1; i>=0; i--)
	{
		int sum=number[i]-'0'+ntakeOver;
		if (i==len-1)
		    sum++;
		if (sum==10)//加1后为10则考虑要进位
		{
			if (i==0)
				isOverflow=true;//最高位进位,则溢出
			else
			{
				ntakeOver=1;//进位为1
				/*sum-=10;*/
				number[i]=/*sum+*/'0';//进位后,此处字符为'0'
			}
		}
		else
		{
			number[i]=sum+'0';
			break;
		}
	}
	return isOverflow;
}

// 字符串number表示一个数字,数字有若干个0开头,打印出这个数字,并忽略开头的0
void printNumber(char* number)
{
	bool isBeginning0 = true;
	int nLength = strlen(number);
	for(int i = 0; i < nLength; ++ i)
	{
		if(isBeginning0 && number[i] != '0')//&&的目的:当第number[i]!=0,则i后面的字符不用判断直接打印
			isBeginning0 = false;

		if(!isBeginning0)
		{
			printf("%c", number[i]);
		}
	}
	printf("\t");
}

/*主功能函数*/
void printOnetoN(int n)//打印出从1到最大的n位十进制数
{
	if (n<=0)
	{
		return;
	}
	char *number=new char[n+1];
	memset(number,'0',n);
	number[n]='\0';
	while(!Increase(number))//在number上加1,如果溢出循环结束
	{
		//打印数字number,字符串number中前面0不打印
		printNumber(number);
	}
}
测试用例:

void main()
{
    printOnetoN(2);
	cout<<endl;
}
技术分享



【剑指offer】打印1到最大的n位数

标签:刷题   c++   

原文地址:http://blog.csdn.net/lsh_2013/article/details/45651061

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!