打印1到最大的n位数
转载:http://blog.csdn.net/jxh_123/article/details/38364923?utm_source=tuicool&utm_medium=referral
题目描述:
输入数字n,按顺序打印出从1最大的n位十进制数。例如输入3,则打印出1,2,3一直到最大的3位数即999.
这里需要注意,本题是核心考察的大数问题,就是怎么存一个很大的数,我们用的是数组进行存储。我们需要考虑下面的问题:
1.如何表示一个n位数?(用字符数组)
2.每次加1都在最低位进行;
3.加1后若发生进位,则将该进位传播给高位数字(这里既可用循环,也可用递归);
4.若最高位发生进位,则溢出,该溢出可作为打印最后一个数的标志;
5.打印数字时,只能从最高位不为0的数字起开始打印。(这符合数字的正常表示)
算法实现:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 bool Increment(char * str)//用于将当前字符串对应的数字加1,返回true表示增加成功 6 { 7 int len = strlen(str); 8 int current = str[len - 1] - '0' + 1;//将个位数字加1,current表示加1后的值 9 int i = len - 1;//下面开始传播个位加1后的连锁进位反应 10 11 while(i >= 0)//用i表示当前位 12 { 13 if(current < 10)//若加1后不进位 14 { 15 str[i] = str[i] + 1; 16 break; 17 } 18 else//如果当前位发生进位 19 { 20 if(i == 0)//如果进位的是最高位,则直接发生溢出 21 { 22 return false; 23 } 24 else//如果进位的不是最高位,这里能保证i!=0,因为上面有个为0的分支处理 25 { 26 str[i] = '0';//先将本位归零 27 i = i - 1;//开始处理本位的上一位 28 current = str[i] - '0' + 1; 29 } 30 } 31 } 32 return true; 33 } 34 35 void print(char *str)//显示该数字 36 { 37 bool begin = false; 38 int i; 39 int len = strlen(str); 40 for(i = 0; i < len; i++) 41 { 42 if(!begin && str[i] != '0') 43 { 44 begin = true; 45 } 46 if(begin)//如果已经找到第一个非0的高位数字 47 { 48 cout<<str[i]; 49 } 50 } 51 cout<<endl; 52 } 53 54 void ToMaxN(int n)//客户端调用的函数 55 { 56 char *str = new char[n + 1]; 57 memset(str, '0', n);//注意初值在中间,不是第三个参数 58 str[n] = '\0'; 59 while(Increment(str)) 60 { 61 print(str); 62 } 63 delete [] str; 64 } 65 66 int main() 67 { 68 int n; 69 while(cin>>n) 70 { 71 if(n >= 1 && n <= 5) 72 { 73 ToMaxN(n); 74 } 75 } 76 return 0; 77 }