您的位置:首页 > 其它

打印1到最大的n位数

2016-01-16 19:36 232 查看
题目:输入数字n,按照顺序打印出从1到最大的n位十进制数,比如输入3,则打印出1、2、3一直到最大的3位数即999。
    解析:我们很容易写出以下的代码,当我们输入的n很大的时候,我们求得的最大n位数不能用int类型或者long long类型表示时,以下代码将会有缺陷。[code]void printOneToMax(int n)
{
	int number= 1;
	for(int i = 0; i < n; ++i)
	{
		number *= 10;
	}
	for(int i = 1; i < number; ++i)
	{
		cout<<i<<endl;
	}
}
我们可以用字符串表示大数,接下来我们用字符串来解决大数问题,用字符串表示数字的时候,最直观的方法是字符串里每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位。因为数字最大是n位的,因此我们需要一个长度为n+1的字符串。当实际数字不够n位时候,在字符串的前半部分补0。
首先我们把字符串中的每一个数字都初始化为‘0’,然后每一次为字符串表示的数字加一,再打印出来,因此我们需要做两件事情:一是在字符串表示的数字上模拟加法,二是把字符串表示的数字打印出来。函数increment实现在表示数字的字符串上加一,而函数print则打印字符串表示的数字。以下代码是我自己写的。#include<iostream>
using namespace std;

//实现字符串表示的数字加一操作
bool increse(char *ch)
{
if(ch == NULL)
return false;
int len = strlen(ch);//得到字符串的长度
if(ch[len - 1] != '9')//判断最后一位是不是‘9’
{
ch[len - 1]++;
return true;
}
bool flag = true;
int i = len - 1;
ch[i] = '0';
while(flag)
{
//依次判断倒数第二位直到正数第一位是不是‘9’
if(ch[i - 1] == '9')
{
if(i - 1 == 0)
{
return false;
}
ch[i - 1] = '0';//如果是'9',则把当前位置为‘0’
i--;
}
else
{
ch[i - 1] ++;//让前一位加一
flag = false;//循环结束
}
}
return true;
}

//输出字符串表示的数字
void printNum(char *ch)
{
if(ch == NULL)
return;
int len = strlen(ch);
int i = 0;
for(; i < len; ++i)
{
if(ch[i] == '0')
{
continue;
}
else
{
break;
}
}
for(;i < len; ++i)
{
cout<<ch[i];
}
}

//打印从1到最大n位的数字
void printOneToMax(int n)
{
if(n <= 0)
return;
char *ch = new char[n + 1];
for(int i = 0; i < n; ++i)
{
ch[i] = '0';
}
ch
= '\0';
while(increse(ch))
{
printNum(ch);
cout<<" ";
}
}

int main(void)
{
printOneToMax(3);
system("pause");
return 0;
}[/code]剑指offer上的非递归代码:
#include<iostream>
using namespace std;

bool increment(char *ch)
{
	bool isOverflow = false;
	int nTakeOver = 0;
	int len = strlen(ch);
	for(int i = len - 1; i >= 0; --i)
	{
		int num = ch[i] - '0' + nTakeOver;
		if(i == len - 1)
			num++;
		if(num >= 10)
		{
			if(i == 0)
				isOverflow = true;
			else
			{
				ch[i] = '0';
				nTakeOver = 1;
			}
		}
		else
		{
			ch[i] = '0' + num;
			break;
		}
	}
	return isOverflow;
}

void print(char *ch)
{
	bool flag = true;
	int len = strlen(ch);
	for(int i = 0; i < len; ++i)
	{
		if(ch[i] != '0' && flag)
		{
			flag = false;
		}
		if(!flag)
		{
			cout<<ch[i];
		}
	}
}

void printMax(int n)
{
	char *ch = new char[n + 1];
	for(int i = 0; i < n; ++i)
	{
		ch[i] = '0';
	}
	ch
 = '\0';
	while(!increment(ch))
	{
		print(ch);
		cout<<" ";
	}
}

int main(void)
{
	printMax(4);
	system("pause");
	return 0;
}
使用全排列的思想:全排列用递归很容易表达,数字的每一位都可能是0~9中的一个数,然后设置下一位。递归结束的条件是我们已经设置了数字的最后一位。
#include<iostream>
using namespace std;

void print(char *ch)
{
	int len = strlen(ch);
	bool flag = true;
	for(int i = 0; i < len; ++i)
	{
		if(ch[i] != '0' && flag)
		{
			flag = false;
		}
		if(!flag)
		{
			cout<<ch[i];
		}
	}
	cout<<" ";
}

void printToMaxRecursively(char *ch,int len,int index)
{
	if(index == len - 1)
	{
		print(ch);
		return;
	}
	for(int i = 0; i < 10; ++i)
	{
		ch[index + 1] = '0' + i;
		printToMaxRecursively(ch,len,index + 1);
	}
}

void printToMax(int n)
{
	if(n <= 0)
		return;
	char *ch = new char[n + 1];
	ch
 = '\0';
	for(int i = 0; i < 10; ++i)
	{
		ch[0] = '0' + i;
		printToMaxRecursively(ch,n,0);
	}
	delete [] ch;
}

int main(void)
{
	//char ch[] = {'0', '1', '0', '4', '\0'};
	//print(ch);
	printToMax(1);
	system("pause");
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: