打印1到最大的n位数即是:
若n=1,则打印1到最大的一位数即是1,2,3,4,5,6,7,8,9;
若n=2,那么打印1到最大的两位数1到99;
虽然我们可以直接用printf输出,但是当n很大的时候,用整型和长整型都会溢出。
为了表示一个大数字我们可以用数组或者字符串来表示,下面是用字符串解决大数的问题。
分析:
1.首先我们需要一个长度为n+1的字符串,用来表示数字的每一位。字符串的最后一个是'\0';
我们用malloc函数来开辟空间,注意利用完空间要进行释放空间(free()).
初始化空间,最后一个字节初始化为'\0',其余都初始化为'0';
2.每一次在字符串表示的数上加1,只要这个数不超过最大的n位数,那么就将这个字符串打印出来。
看是否大于最大的n位数,可以根据字符串表示的数加1第一个字符是否产生进位来判断,例如:999+1=1000,它的第一个字符产生了进位。这样循环就结束,不再打印
例如:
假定n为2,给字符串表示的数上加1,我们可以用循环来完成,我们可以将第二个字符(下标为i=1)一次加1,当第二个数为9时,它加1为10;那么我们可以根据它的下标判断它是否超过99,显然没有,因为它的下标是1,不是第一个元素。那就将这一位置为0;给下标为0的元素加1,即现在字符串表示的数为10,判断它的正确性,然后继续前面的步骤,给第二个元素一次加1,一直循环直到第一位为9,第二位也为9,给第二位加1时为10,它不是第一位那么将这一位置置0;给下标0的元素加1,这时第一个元素为10,产生进位,那么不再打印。
3.打印字符串时应该从第一个不为0的字符开始输出。
实现代码如下:
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
void PrintNumber(char *number);
int Increment(char *number);
void Print1ToMaxOfNDigits(int n)
{
int i = 0;
int j = 0;
int ret = 0;
if (n <= 0)
return;
char *number = (char*)malloc((n + 1)*sizeof(char));
memset(number, '0', n);
number[n] = '\0';
while (Increment(number)!=1)
{
PrintNumber(number);
}
free(number);
}
int Increment(char *number)
{
assert(number);
int nTakeOver = 0;
int i = 0;
int nsum = 0;
int nlength = strlen(number);
for (i = nlength - 1; i >= 0; i--)
{
nsum = number[i] - '0' + nTakeOver;
if (i == nlength - 1)
nsum++;
if (nsum >= 10)
{
if (i == 0)
{
return 1;
}
else
{
nsum -= 10;
nTakeOver = 1;
number[i] = '0' + nsum;
}
}
else
{
number[i] = '0' + nsum;
break;
}
}
return 0;
}
void PrintNumber(char *number)
{
assert(number);
int length = strlen(number);
int i = 0;
int flag = 1;
for (i = 0; i < length; i++)
{
if (flag && number[i] != '0')
flag = 0;
if (flag == 0)
printf("%c", number[i]);
}
printf("\t");
}
int main()
{
int n = 0;
scanf("%d", &n);
Print1ToMaxOfNDigits(n);
system("pause");
return 0;
}