题目:输入数字n,按顺序打印从1到最大的n位十进制数,比如输入3,就打印从1到999.
分析:首先不可能定义int型的数,当输入的n稍微大一点就溢出了,所以一般要考虑用字符串模拟数字的解法。我们一共用了三个函数,第一个函数print用来打印某一个数字,Increment用来自增,但是要加上防溢出的机制,printMaxDigit是实现函数。总的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void print(char *number)//打印某一个数字的函数
{
int len=strlen(number);//我们要判断首字母是否为0
bool isbeginning0=true;
for(int i=0;i<len;i++)
{
if(isbeginning0&&number[i] != '0')
isbeginning0=false;
if(!isbeginning0)//字母为0的就不用打印,为了照顾我们的数字习惯
printf("%c",number[i]);
}
printf("\t");
}
bool Increment(char *number)//自增的函数,每次加1
{
bool isflow=false;//判断是否溢出
int len=strlen(number);
int take=0;
for(int i=len-1;i>=0;i--)
{
int nsum=number[i]-'0'+take;//取出当前位的数
if(i==len-1)
nsum++;
if(nsum>=10)
{
if(i==0)//溢出
isflow=true;
else
{
nsum-=10;
take=1;
number[i]='0'+nsum;
}
}
else
{
number[i]='0'+nsum;
break;
}
}
return isflow;
}
void printMaxDigit(int n)//判断
{
if(n<0)
return;
char *number=(char *)malloc(sizeof(char)*(n+1)); //申请n+1个空间,留一个用来进位
memset(number,'0',n);//全部初始化
number[n]='\0';//最后一位结束
while(!Increment(number))//自增
{
print(number);//打印出对应的数字
}
free(number);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
printMaxDigit(n);
printf("\n");
}
return 0;
}原文:http://blog.csdn.net/zyh920521/article/details/45046365