您的位置:首页 > 职场人生

【面试题】剑指Offer-12-打印1到N最大的数字

2017-04-03 20:14 447 查看

题目概述

输入数字N,按顺序打印出从1到最大的N位10进制数字

比如输入3,则打印1-999之间的数字

解决思路

直接写个小函数,用循环求出最大的N位数

然后再打印

注意:当输入的N很大的时候,很有可能造成越界的情况!

改进

new出来一串字符数组,长度为N+1

从低到高依次改变一个位的数字

递归判断每一个位

如果递归达到长度为N的数字,则打印

代码实现

#include<iostream>
using namespace std;

//打印数字
void PrintStrNum(char* str)
{
bool IsBegin = true;
size_t length = strlen(str);
for (size_t i = 0; i < length; ++i)
{
//不打印之前的0
if (IsBegin && str[i] != '0')
IsBegin = false;

if (IsBegin == false)
printf("%c", str[i]);
}

//打印一个Table键
printf("\t");
}

//递归调用该函数进行统计数字
void _PrintDigits(char* num,const size_t length,const size_t index)
{
//所有位数统计完毕,可以打印
//并返回
if (index == length - 1)
{
PrintStrNum(num);
return;
}

//没有统计完毕,递归统计数字
for (size_t i = 0; i < 10; ++i)
{
num[index + 1] = i + '0';
_PrintDigits(num, length, index + 1);
}
}

//初始化及调用递归函数
void PrintDigits(const int length)
{
if (length <= 0)
return;

char* num = new char[length + 1];
num[length] = '\0';
size_t index = 0;
for (size_t i = 0; i < 10; ++i)
{
num[0] = i + '0';
_PrintDigits(num, length, 0);
}
cout << endl;
}

void TestPrintDigits()
{
cout << "两位数:" << endl;
PrintDigits(2);

cout << "三位数:" << endl;
PrintDigits(3);

cout << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: