题目:输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
字符串模拟加法:
bool increment( char * number )
{
bool isOverflow = false;
int nTakeOver = 0, i;
int nLength = strlen( number );
for( i = nLength - 1; i >= 0; i-- )
{
int nSum = number[i] - '0' + nTakeOver;
if( i == nLength - 1 )
nSum++;
if( nSum >= 10 )
{
if( 0 == i )
isOverflow = true;
else
{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = '0' + nSum;
break;
}
}
return isOverflow;
}
void printNumber( char * number )
{
bool isBeginning0 = true;
int nLength = strlen( number ), i;
for( i = 0; i < nLength; i++ )
{
if( isBeginning0 && '0' != number[i] )
isBeginning0 = false;
if( !isBeginning0 )
printf("%c", number[i]);
}
}
void print1ToMaxOfNDigits( int n )
{
if( n <= 0 ) throw(" Invalid Parameters ");
char * number = new char[n + 1];
memset( number, '0', n );
number[n] = '\0';
int i;
while( !increment( number ) )
{
printNumber( number );
printf(" ");
}
delete []number;
}
数字排列解法:
void printNumber( char * number )
{
bool isBeginning0 = true;
int nLength = strlen( number ), i;
for( i = 0; i < nLength; i++ )
{
if( isBeginning0 && '0' != number[i] )
isBeginning0 = false;
if( !isBeginning0 )
printf("%c", number[i]);
}
}
void print1ToMaxOfNDigitsRecursively(char number[], int length, int index )
{
if( index == length - 1 )
{
printNumber( number );
printf(" ");
return;
}
int i;
for( i = 0; i < 10; i++ )
{
number[index + 1] = i + '0';
print1ToMaxOfNDigitsRecursively( number, length, index + 1 );
}
}
void print1ToMaxOfNDigits( int n )
{
if( n <= 0 ) throw(" Invalid Parameters ");
char * number = new char[n + 1];
memset( number, '0', n );
number[n] = '\0';
int i;
for( i = 0; i < 10; i++ )
{
number[0] = i + '0';
print1ToMaxOfNDigitsRecursively( number, n, 0 );
}
delete []number;
}