1 // 打印从1到最大的n位数.cpp : 定义控制台应用程序的入口点。
2 //
3
4 /********************************************
5
6 题目:输入数字n,按顺序打印从1到最大的n位十进制数,
7 比如3,则打印1,2,3,一直到999;
8
9 ********************************************/
10
11 #include "stdafx.h"
12 #include <string.h>
13 #include <iostream>
14 using namespace std;
15
16 void PrintNumber(char* Number)
17 {
18 bool isBegin=true;
19 int nLength=strlen(Number);
20 for(int i=0;i<nLength;i++)
21 {
22 if(isBegin&&Number[i]!='0')
23 isBegin=false;
24 if(!isBegin)
25 cout<<Number[i];
26 }
27 cout<<"\t";
28 }
29
30 bool Increment(char* Number)
31 {
32 bool IsOverflow=false;
33 int nTakeOver=0;
34 int nLength=strlen(Number);
35 for(int i=nLength-1;i>=0;i--)
36 {
37 int nSum=Number[i]-'0'+nTakeOver;
38 if(i==nLength-1)
39 nSum++;
40 if(nSum>=10)
41 {
42 if(i==0)
43 IsOverflow=true;
44 else
45 {
46 nSum-=10;
47 nTakeOver=1;
48 Number[i]=nSum+'0';
49 }
50 }
51 else
52 {
53 Number[i]='0'+nSum;
54 break;
55 }
56 }
57
58 return IsOverflow;
59 }
60
61
62 void Print1ToMaxOfDigits(int n)
63 {
64 if(n<0)
65 return;
66 char *Number=new char[n+1];
67 memset(Number,'0',n);
68 Number[n]='\0';
69 while(!Increment(Number))
70 PrintNumber(Number);
71 delete []Number;
72 }
73
74
75
76
77 void Print1ToMaxNDigitsRecur(char *Number,int Length,int index)
78 {
79 if(index==Length-1)
80 {
81 PrintNumber(Number);
82 return;
83 }
84 for(int i=0;i<10;++i)
85 {
86 Number[index+1]=i+'0';
87 Print1ToMaxNDigitsRecur(Number,Length,index+1);
88 }
89 }
90
91
92 void Print1ToMaxtOfNDigits(int n)
93 {
94 if(n<=0)
95 return;
96 char* Number=new char[n+1];
97 Number[n]='\0';
98 for(int i=0;i<10;i++)
99 {
100 Number[0]=i+'0';
101 Print1ToMaxNDigitsRecur(Number,n,0);
102 }
103 }
104
105 int _tmain(int argc, _TCHAR* argv[])
106 {
107 //Print1ToMaxOfDigits(5);
108 Print1ToMaxtOfNDigits(5);
109 return 0;
110 }