题目:输入数字n,按顺序打印出从1到最大的n为十进制数。比如输入3,则打印出1,2,3一直到最大的三位数即999。
思路:这道题一看就是一个大数问题。对于解决这个大数的问题,可以用到字符串或者数组都可以。
字符串解法:
对于一个字符串的话,
首先要考虑申请空间的时候,要申请n+1个因为最后还有一个’\0’
进行加法时从最后一位进行加法
判断是否溢出,可采用看是否到第一位了并要进位了
代码:
bool Increment(char** ps)
{
char* str = NULL;
assert(ps);
str = *ps;
bool isoverflow = false;
int length = strlen(str);
int takeover = 0;
int num = 0;
for (int i = length - 1; i >= 0; i--)
{
num = str[i] - '0' + takeover;
//只加一次1
if (i == length - 1)
{
num++;
}
//判断是否溢出或者是进位
if (num >= 10)
{
//溢出
if (i == 0)
{
isoverflow = true;
}
else
{
num -= 10;
str[i] = '0' + num;
takeover = 1;
}
}
else
{
str[i] = '0' + num;
break;
}
}
return isoverflow;
}
void PrintStr(char* str)
{
assert(str);
bool isbeginning = false;
int length = strlen(str);
for (int i = 0; i < length; i++)
{
if (str[i] != '0' && !isbeginning)
{
isbeginning = true;
}
if (isbeginning)
{
printf("%c", str[i]);
}
}
printf(" ");
}
void Print1ToMaxNdights(int n)
{
if (n <= 0)
{
return;
}
char* str = (char*)malloc(sizeof(char) * (n + 1));
if (str == NULL)
{
perror("use malloc!");
}
memset(str, '0', n);
str[n] = '\0';
while (!Increment(&str))
{
PrintStr(str);
}
free(str);
str = NULL;
printf("\n");
}
int main()
{
int n = 0;
scanf("%d", &n);
Print1ToMaxNdights(n);
return 0;
}
数组:对于数组和字符串差不多,只是将动态申请空间变成了整形的指针即可,后面就只需要整型了。