面试题17:打印从1到最大的n位数
本题考查大数问题。大数一般用字符串或者数组表示。注意,strlen()函数返回的值是数组'\0'前元素的个数,并不包括'\0'。
C++版本
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
bool increment(char number[]){
// 记录是否到达计数尽头
bool isOverFlow = false;
// 第n个位置的进位
int nTakeOver = 0;
int nLength = strlen(number);
for(int i = nLength-1; i>=0; i--){
// 计算第n个位置的十进制值
int nSum = number[i] - '0' + nTakeOver;
// 如果是最后一位数,则加1
if(i == nLength - 1)
nSum++;
// 如果产生了进位
if(nSum > 9){
// 如果是首位产生了进位
if(i == 0)
isOverFlow = true;
else{
// 当前位置0
number[i] = '0';
// 将下一次的进位置一
nTakeOver = 1;
}
}
// 没有产生进位,则接下来不需要再计算
else{
number[i] = '0' + nSum;
break;
}
}
return isOverFlow;
}
void printNumber(char number[]){
bool isBeginning0 = true;
int nLength = strlen(number);
for(int i = 0; i < nLength; i++){
if(isBeginning0 && number[i] != '0')
isBeginning0 = false;
if(!isBeginning0)
printf("%c", number[i]);
}
printf("\t");
}
void printf1ToMaxOfDigits(int num){
if(num < 0)
return ;
char number[num+1];
memset(number, '0', num);
number[num] = '\0';
while(!increment(number)){
printNumber(number);
}
}
int main()
{
printf1ToMaxOfDigits(2);
return 0;
}