加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数问题

发布时间:2020-12-14 01:50:38 所属栏目:大数据 来源:网络整理
导读:题目: 打印1到最大的n位数 一开始看到这个题觉得很简单,就随手写了一小段程序,后来才深深意识到还是too young too naive。 以下这段是第一次写出的代码。 运行正确又怎样?你输入一个100000000000000000000000000000000000000000000试试啊,还自作聪明的

题目:

打印1到最大的n位数


一开始看到这个题觉得很简单,就随手写了一小段程序,后来才深深意识到还是too young too naive。

以下这段是第一次写出的代码。

运行正确又怎样?你输入一个100000000000000000000000000000000000000000000试试啊,还自作聪明的用了一个long long类型输出,然并卵好吗

void?print1ToMaxN(int?n)
{
	long?long?i?=?0;
	while?(i?<?pow(10,?n))
	{
		cout?<<?i<<"?";
		i++;
	}
}


程序1.0????用字符串模拟大数加法

????经过参考了一些程序之后,写出来如下程序

bool?Increment(char*number)//判断字符串是否已经到最大值
{
	bool?IsOverFlow?=?false;//溢出
	int?nTakeover?=?0;//进位
	int?nLength?=?strlen(number);

	for?(int?i?=?nLength?-?1;?i?>=?0;?i--)
	{
		int?sum?=?number[i]?-?'0'?+?nTakeover;//转化为数字
		if?(i?==?nLength?-?1)
			sum++;

		if?(sum?>=?10)
		{
			if?(i?==?0)
				IsOverFlow?=?true;
			else
			{
				sum?-=?10;
				nTakeover?=?1;
				number[i]?=?'0'?+?sum;//转化为字符
			}
		}
		else
		{
			number[i]?=?'0'?+?sum;//从数字转化为字符
			break;
		}
	}
	return?IsOverFlow;

}
void?PrintNumber(char*number)
{
	bool?isBeginning0?=?true;
	int?length?=?strlen(number);

	for?(int?i?=?0;?i?<?length;?++i)
	{
		if?(isBeginning0&&number[i]?!=?'0')
			isBeginning0?=?false;
		if?(!isBeginning0)//跳过0打印
		{
			printf("%c",?number[i]);
		}

	}
}
void?print1ToMaxN(int?n)
{
	if?(n?<?0)
		return;
	char*number?=?new?char[n?+?1];
	memset(number,?'0',?n);
	number[n]?=?'';

	while?(!Increment(number))
	{
		PrintNumber(number);
	}
	delete[]number;
}

注意:

1.应考虑到大数问题

2.在打印时的边界值判断问题

3.打印时遇到0怎么办


程序1.1

????既然有了上面的程序,不难想到可以用递归来实现(其实我也觉得挺难的……)

void?PrintNumber(char*number)
{
	bool?isBeginning0?=?true;
	int?length?=?strlen(number);

	for?(int?i?=?0;?i?<?length;?++i)
	{
		if?(isBeginning0&&number[i]?!=?'0')
			isBeginning0?=?false;
		if?(!isBeginning0)//跳过0打印
		{
			printf("%c",?number[i]);
		}

	}
}
void?PrintToMaxNRecursively(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';
		PrintToMaxNRecursively(number,?length,?index?+?1);
	}
}
void?print1ToMaxN(int?n)
{
	if?(n?<?0)
		return;

	char*number?=?new?char[n?+?1];
	number[n]?=?'';

	for?(int?i?=?0;?i?<?10;?i++)
	{
		number[0]?=?i?+?'0';
		PrintToMaxNRecursively(number,?n,?0);
	}
	delete[]number;
}

未完待续

。。。。(更新关于大数加减乘除的方法)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读