1.递归的方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printNumber(char *number)
{
int i;
for (i=0; number[i]!='\0' ; ++i)
{
if (number[i] != '0')
{
break;
}
}
if (number[i] != '\0')
{
printf("%s\t", number+i); /*这个比上面的一个个的打印快了4倍以上*/
}
}
void print1ToMaxofNDigitsRecurisively(char *number, int n, int index)
{
int i;
/*递归结束的条件,已经设置了数字的最后一位*/
if (index == n)
{
printNumber(number);
return ;
}
for (i=0; i<10; ++i)
{
number[index] = i + '0';
print1ToMaxofNDigitsRecurisively(number, n, index+1);
}
}
void print1ToMaxofNDigits(int n)
{
char *number;
if (n <= 0)
{
return ;
}
number = (char *)malloc(sizeof(char)*(n+1));
number[n] = '\0';
print1ToMaxofNDigitsRecurisively(number, n, 0);
printf("\n");
free(number);
number = NULL;
}
int main(void)
{
int n;
while (scanf("%d", &n) != EOF)
{
print1ToMaxofNDigits(n);
}
return 0;
}
2.字符串模拟数字加法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void printNumber(char *number)
{
int i;
for (i=0; number[i]!='\0' ; ++i)
{
if (number[i] != '0')
{
break;
}
}
/* for (; number[i]!='\0'; ++i)
{
printf("%c", number[i]);
}
*/
printf("%s\t", number+i); /*这个比上面的一个个的打印快了4倍以上*/
}
int increment(char *number, int n)
{
int i, num;
int isOverflow = 0;
int carry = 0;
for (i=n-1; i>=0; --i)
{
num = number[i] - '0' + carry;
if (i == n-1)
{
++num; /*只有个位数执行加1操作*/
}
if (num > 9)
{
if (i == 0)
{
isOverflow = 1;
break;
}
else
{
num -= 10;
carry = 1;
number[i] = num + '0';
}
}
else
{
number[i] = num + '0';
break; /*没有进位时结束*/
}
}
return isOverflow;
}
void print1ToMaxofNDigits(int n)
{
char *number;
if (n <= 0)
{
return ;
}
number = (char *)malloc(sizeof(char)*(n+1));
memset(number, '0', sizeof(char)*(n));
number[n] = '\0';
while (0 == increment(number, n))
{
printNumber(number);
}
printf("\n");
free(number);
number = NULL;
}
int main(void)
{
int n;
while (scanf("%d", &n) != EOF)
{
print1ToMaxofNDigits(n);
}
return 0;
}