输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1 输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印 n 为正整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1.如果不考虑大数问题
pow求幂
class Solution {
public:
vector<int> printNumbers(int n) {
vector<int>res;
for(int i=1,max=pow(10,n);i<max;i++)
{
res.push_back(i);
}
return res;
}
};
2.大数问题
需要设立一个n位的字符串,然后通过字符串判断每一位数字是否超过最大位数。
class Solution {
public:
vector<int>res;
vector<int> printNumbers(int n) {
if (n <= 0) return res;
string number(n,'0');//位数字符串
while(!Increment(number))
{
saveNumber(number);
}
return res;
}
bool Increment(string &number)//判断数字是否越界
{
bool isOverFlow=false;//是否越界
int TakeOver=0;//是否进位
int lenth=number.size();
for(int i=lenth-1;i>=0;i--)//从数组最大 数字最低位开始算起
{
int temp=number[i]-'0'+TakeOver;//将字符转成int 并且加上是否进位
if(i==lenth-1)//如果数字是最后一位那么 自身+1 比如第一次进来是0 需要加1
{
temp++;
}
if(temp>=10)//如果自身超过9 则需要进位
{
if(i==0)//如果此时是最大一位 如果进位则越界
{
isOverFlow=true;//退出大循环的条件
}
else
{
TakeOver=1;//否则标志进位为1
number[i]=temp-10+'0';//自身变为个位数
}
}
else
{
number[i]=temp+'0';//如果小于10 则直接放入字符串里然后 退出循环
break;
}
}
return isOverFlow;
}
void saveNumber(string number)
{
string s = "";
bool isBegin0 = true;
string::iterator it = number.begin();
while (it != number.end())//遍历字符串
{
if (isBegin0 && *it != '0') isBegin0 = false;
if (!isBegin0)
{
s += *it;
}
it++;
}
res.push_back(stoi(s));
}
};