题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999。
此题很容易误入陷阱!
//第一次解法,不幸调入陷阱
void print(int n)
{
if (n<1)
{
printf("Invalid Input!\n");
return;
}
long maxNum=(int)pow(10.0,n);//如果n很大,不论int还是long都会溢出
for (int i=0; i<maxNum; i++)
{
printf("%d ",i);
}
}显然上面的解法不能让人满意。
在字符串上模拟数字加法的解法,绕过陷阱!
//字符串number表示一个数字,在number上加1,如果溢出返回true,否则返回false
bool Increase(char *number)
{
bool isOverflow=false;
//记录进位
int ntakeOver=0;
//数字的长度
int len=strlen(number);
for (int i=len-1; i>=0; i--)
{
int sum=number[i]-'0'+ntakeOver;
if (i==len-1)
sum++;
if (sum==10)//加1后为10则考虑要进位
{
if (i==0)
isOverflow=true;//最高位进位,则溢出
else
{
ntakeOver=1;//进位为1
/*sum-=10;*/
number[i]=/*sum+*/'0';//进位后,此处字符为'0'
}
}
else
{
number[i]=sum+'0';
break;
}
}
return isOverflow;
}
// 字符串number表示一个数字,数字有若干个0开头,打印出这个数字,并忽略开头的0
void printNumber(char* number)
{
bool isBeginning0 = true;
int nLength = strlen(number);
for(int i = 0; i < nLength; ++ i)
{
if(isBeginning0 && number[i] != '0')//&&的目的:当第number[i]!=0,则i后面的字符不用判断直接打印
isBeginning0 = false;
if(!isBeginning0)
{
printf("%c", number[i]);
}
}
printf("\t");
}
/*主功能函数*/
void printOnetoN(int n)//打印出从1到最大的n位十进制数
{
if (n<=0)
{
return;
}
char *number=new char[n+1];
memset(number,'0',n);
number[n]='\0';
while(!Increase(number))//在number上加1,如果溢出循环结束
{
//打印数字number,字符串number中前面0不打印
printNumber(number);
}
}测试用例:
void main()
{
printOnetoN(2);
cout<<endl;
}
原文地址:http://blog.csdn.net/lsh_2013/article/details/45651061