打印1到最大的n位数

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

分析:本题要考虑如何表达一个大数(即超出计算机所能表示的范围)的问题。常用的方法是用字符串来表示一个较大的数。本题可以先分配一个n+1大小的字符串数组,然后在该字符串数组上,模拟+1操作,并打印出结果。

void  Print1ToMaxofDigits(int iN)
{
	if (iN <= 0){
		return ;
	}

	char *number = new char[iN+1];
	memset(number,'0', iN);//将字符串的初始值设置为'0'
	number[iN]='\0';
	while(!Increment(number)){//递增
		PrintNumber(number);//打印
	}
	delete [] number;
}

void PrintNumber(char* number)
{
	int i=0;
	while(number[i] == '0'){
		i++;
	}
	printf("%s\n",&number[i]);
}

bool Increment(char* number)
{
	bool iOverflow = false;
	int  iTakeOver = 0;
	int  iLen = strlen(number);

	for (int i=iLen-1; i>=0; i--)
	{
		int iSum = number[i]-'0'+iTakeOver;
		if (i == iLen -1){
			iSum++;
		}

		if (iSum >= 10){
			if (i == 0 ){
				iOverflow = true;
			}else{
				iSum -= 10;
				iTakeOver = 1;
				number[i] = iSum + '0';
			}

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

	return iOverflow;
}

扩展:用字符串模拟大数相加(正数)。

bool BigDataSum(char* num1, char* num2)
{
	int iNum1Len = strlen(num1);
	int iNum2Len = strlen(num2);
	int iLen = 0;
	iNum1Len>iNum2Len?(iLen=iNum1Len):(iLen=iNum2Len);

	char* strNum1 = new char[iLen+1];
	char* strNum2 = new char[iLen+1];
	memset(strNum1,'0',iLen);
	memset(strNum2,'0',iLen);
	strNum1[iLen]='\0';
	strNum2[iLen]='\0';

	strcpy(strNum1+iLen-iNum1Len,num1);
	strcpy(strNum2+iLen-iNum2Len,num2);
	puts(strNum1);
	int iTakeOver = 0;
	bool bOverflow = true;
	for (int i=iLen-1; i>=0; i--)
	{
		int iValue1 = strNum1[i]-'0';
		int iValue2 = strNum2[i]-'0';
		int iSum = iValue1+iValue2+iTakeOver;

		if (iSum >= 10){
			if (i == 0){
				bOverflow = false;
			}else{
				iSum -= 10;
				iTakeOver = 1;
				strNum1[i] = iSum+'0'; 
			}
		}else{
			strNum1[i] = iSum+'0';
		}
	}

	puts(strNum2);
	puts(strNum1);

	delete[] strNum1;
	delete[] strNum2;

	return bOverflow;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值