/***********************************************************************************************
*文件名称:lx6
*创建者:
*创建时间:2014/6/20
*文件说明:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3
* 一直到最大的3位数即999。
***********************************************************************************************/
#include
#include
#include
#include
int n;
/************************************************************************************************
*定义的子函数
************************************************************************************************/
void Solution1(void);
bool Solution2(char *numberstring);
void Solution3(int n);
void Print1ToMAX(int n);
void Print1ToMAXRecursively(char *numstr,int length,int index);
void PrintNumber(char *numstr);
/************************************************************************************************
*函数名称:Solution1
*函数参数:void
*返回值类型:void
*函数功能:按顺序输出1~10n-1(n为上标)的数字
************************************************************************************************/
void Solution1(void)
{
double max;
int i;
max=pow(10.0,n)-1; /*求出n位整数的最大值*/
for(i=1;i<=(int)max;i++) /*依次打印出1到最大的n位数 */
{
printf("%d ", i);
if(i%15==0)
printf("\n");
}
}
/************************************************************************************************
*函数名称:Increment1
*函数参数:numberstring
*返回值类型:bool
*函数功能:在字符串上模拟加法,每次加的数值为1
************************************************************************************************/
bool Increment1(char *numberstring)
{
bool isOverflow = false;
int i;
int TakeOver = 0; /*进位*/
int Length = strlen(numberstring); /*求出整数字符串的长度+1*/
int SumBit ; /*求出某一位的数值*/
for(i=Length-1;i>=0;i--)
{
SumBit = numberstring[i]-'0'+TakeOver; /*将字符型数值转换成整型数值*/
if (i==Length-1)
SumBit++;
if (SumBit >= 10)
{
if(i==0)
isOverflow = true; /*如果最高位的数值大于9,则满足循环结束的条件*/
else
{
TakeOver = 1; /*如果不满足结束条件,则需要向高一位进1*/
numberstring[i]=SumBit-10+'0'; /*同时修改该位的值,并转化成字符串存储*/
}
}
else
{
numberstring[i]=SumBit+'0';
break; /*第i位的值不大于9时,存储后退出循环*/
}
}
return isOverflow;
}
/************************************************************************************************
*函数名称:Solution2
*函数参数:n
*返回值类型:void
*函数功能:分配内存空间,在字符串上模拟加法,并打印输出结果
************************************************************************************************/
void Solution2(int n)
{
char *numberstring;
numberstring = (char *)malloc((n+1)*sizeof(char)); /*分配n+1个char类型的内存空间*/
if(n<0)
return ; /*如果n小于0,则直接返回*/
memset(numberstring, '0', n); /*将分配的内存块清零*/
numberstring[n] = '\0';
while(!Increment1(numberstring))
PrintNumber(numberstring);
free(numberstring); /*释放分配的内存空间*/
}
/************************************************************************************************
*函数名称:Solution3
*函数参数:n
*返回值类型:void
*函数功能:分配内存空间,递归调用,打印1到最大的n位数
************************************************************************************************/
void Solution3(int n)
{
int i;
char *numberstring;
numberstring = (char *)malloc((n+1)*sizeof(char)); /*分配n+1个char类型的字符块*/
if(n<=0)
return ; /*如果n小于0,则直接返回*/
memset(numberstring, '0', n); /*将分配的内存块清零*/
numberstring[n] = '\0';
for(i=0;i<10;i++)
{
numberstring[0]= i+'0';
Print1ToMAXRecursively(numberstring,n,0);
}
free(numberstring);
}
/************************************************************************************************
*函数名称:Print1ToMAXRecursively
*函数参数:numstr, length, index
*返回值类型:void
*函数功能:递归调用,求出除最高位外剩余位数的值,并打印输出求得的值
************************************************************************************************/
void Print1ToMAXRecursively(char *numstr,int length,int index)
{
int i;
if(index == length-1)
{
PrintNumber(numstr);
return ;
}
for(i=0;i<10;i++)
{
numstr[index+1] = i+'0';
Print1ToMAXRecursively(numstr,length,index+1);
}
}
/************************************************************************************************
*函数名称:PrintNumber
*函数参数:numstr
*返回值类型:void
*函数功能:打印输出数值,高位的0不打印出来
************************************************************************************************/
void PrintNumber(char *numstr)/*输出时高位的0不打印出来*/
{
int isHead = 1;
int Length = strlen(numstr);
for(int i = 0; i