标签:
题目:输入数字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