温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

字符串上模拟加法

发布时间:2020-07-20 17:03:54 来源:网络 阅读:747 作者:下一个明天 栏目:编程语言

题目:

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

   此题看起来简单,当我刚开始看到问题后,首先想到的就是先求出最大值,然后在一个一个打印出就ok啦。但是仔细理解题意,并没有告诉n的取值范围。若n的值非常大,可能就超过了int或者long long的范围。也就是说在做此题时,需要考虑大数。

  为解决存大数的问题,我们可以利用数组或者字符串存大数。接下来我用字符串来解决大数问题。

  首先,需要考虑两个问题:

  (1)在字符串上模拟加法

  (2)将字符串中的数字打印出来


程序实现:


模拟加法:

bool inc(char* num,int n)//模拟加法
{
	int i = 0;
	int m = 0;
	int take = 0;//进位
	for(i=n-1;i>=0;i--)
	{
		m = num[i]-'0'+ take;
		take = 0;//进位置0
		if(i == n-1) //从末尾加
		{
			m++;
		}
		if(m >= 10)//产生进位
		{
			if(i == 0)//若最高为溢出,终止
				return 0;
			else
			{
				take = 1;
				num[i] = m - 10 + '0';//进位后,将本位置0
			}
		}
		else
		{
			num[i] = m + '0';//不产生溢出时,在本位上加
		}
	}
	return true;
}

 打印:

//void print(char* num,int n)
//{
//	bool flag = true;//标志位
//	int i = 0;
//	for(i=0;i<n;i++)
//	{
//		if(flag && num[i] != '0')
//		{
//			flag = false;
//		}
//		if(!flag)//若高位不为0,打印
//		{
//			printf("%c",num[i]);
//		}	
//	}
//	cout<<" ";
//}

void print(char* num,int n)
{
	int i = 0;
	for(i=0;i<n;i++)
	{
		if(num[i] != '0')
			break;
	}
	printf("%s",num+i);
}

 测试:

int main()
{
	int n = 3;//3位数
	char* str = new char[n+1];//字符串的最后一位为‘\0’,多开辟一个空间
	memset(str,'0',n);//初始化
	str[n] = '\0';
	while(inc(str,n))
	{
		print(str,n);
	}
	delete[] str;//释放空间
	str = NULL;
	return 0;
}


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI