题目:输入数字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;
}