法一:大数运算,字符串
注意点:
1 最后的打印要判断非数值位,非数值位不输出
2 在加一的过程中要避免溢出,譬如只求三位数,但是999+1为1000,这个时候就溢出了,我们要结束循环
#include <iostream>
#include <cstring>
using namespace std;
bool IncreaseNumber(char* number,int len){
int nSum = number[len-1] - '0';
nSum += 1;
if(nSum<10){
number[len-1] = '0' + nSum;
return true;
}
int index = len - 2;
number[len-1] = '0' + (nSum - 10);
while(index>=0){
nSum = 1 + (number[index] - '0');
if(nSum<10){
number[index] = '0' + nSum;
return true;
} else {
number[index] = '0' + (nSum - 10);
index--;
}
}
return false;
}
void PrintNumber(char* number,int len){
int res = 0;
bool beginOfZero = true;
for(int i=0;i<len;i++){
if(number[i]=='0' && beginOfZero) continue;
else beginOfZero = false;
res = res*10 + (number[i] - '0');
}
std::cout<<res<<std::endl;
}
void Print1ToMaxnDigits(int n){
if(n<=0) return;
char *number = new char[n+1];
memset(number,'0',n);
number[n] = '\0';
while(IncreaseNumber(number,n)){
PrintNumber(number,n);
}
delete []number;
}
int main(){
int n=3;
Print1ToMaxnDigits(n);
return 0;
}
法二 数字排列
#include <iostream>
#include <cstring>
using namespace std;
void PrintNumber(char* number,int len){
int res = 0;
bool beginOfZero = true;
for(int i=0;i<len;i++){
if(number[i]=='0' && beginOfZero) continue;
else beginOfZero = false;
res = res*10 + (number[i] - '0');
}
std::cout<<res<<std::endl;
}
void Print1ToMaxnDigitsCore(char* number,int len,int index){
if(index == len-1){
PrintNumber(number,len);
return;
}
for(int i=0;i<10;i++){
number[index+1] = '0' + i;
Print1ToMaxnDigitsCore(number,len,index+1);
}
}
void Print1ToMaxnDigits(int n){
if(n<=0) return;
char *number = new char[n+1];
memset(number,'0',n);
number[n] = '\0';
for(int i=0;i<10;i++){
number[0] = '0' + i;
Print1ToMaxnDigitsCore(number,n,0);
}
delete []number;
}
int main(){
int n=3;
Print1ToMaxnDigits(n);
return 0;
}