.输出 1 到最大的 N 位数
题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数。
似乎这么不到十行就解决了,
输出结果如下:
题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数。
比如输入 3,则输出 1、2、3 一直到最大的 3 位数即 999。
--------------------------------------------------
(1)第一种:直接法
这道题看起来还是比较简单的
void CountNum(int N){
int max=0;
while(N-->0)
max = 10*max + 9;
int i = 1;
while(i<=max)
cout<<i++<<endl;
}
似乎这么不到十行就解决了,
不过大家可以考虑几个问题再改进改进。
如果输入的是20位,30位或者更大呢?
这时候我们用longlong都会溢出了,所以我们这里不能用常规的加法进行,可以用字符串来模拟加法运算
我们new char[N+1]个字节单元,最后一个放输出结束符号'\0'
那么我们每次对低位+1如果等于9了,那么就往前加一,模拟加法,这就不会有溢出现象了。
借用一个str表示当前计算到的最高位,每次从这里输出即可
void CountNum2(int N){
char *str = new char[N+1];
memset(str,'0',N);
str[N]='\0';
str[N-1]='1';
char *end = str + N-1;
char *count = end;//end表示个位数在的位置
int n = N;
bool isOver= false;//是否结束的标志
str=count;//str记录了当前最高位的位置
while(!isOver){
cout<<str<<endl;
while(!isOver && *count == '9'){
//这里循环是往高位找到一个非9的才可以加1
*count = '0';
if(str==count){
if(n>1){
n--;
str--;
count--;
}else
isOver= true;
}else
count--;
}
//not 9
(*count)++;
count = end;
}
}
其实上面加法模拟中我们发现低位一直在进行一个递归操作,即 ”当前位=9,向高位+1,且当前位=0,再从低位开始加法“
void CountNum3(int N){
char *str = new char[N+1];
memset(str,'0',N);
str[N]='\0';
Count(str,str,str+N-1);
}
void Count(char* p, char *str, char *end){
if(p == end){
while(*p < '9'){
(*p)++;
Print(str);
}
return;
}
while(*p <= '9'){
*(p+1) = '0'-1;
Count(p+1,str,end);
(*p)++;
}
}
void Print(char *str){
while(*str == '0')
str++;
cout<<str<<endl;
}
输出结果如下:
1
1
2
3
4
5
6
7
8
9