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