题目要求:
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
示例1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
说明:
用返回一个整数列表来代替打印
n 为正整数
题目分析
1、方法1先计算最大数值再挨个打印
首先根据n计算出最大的n位数,然后用一个for循环挨个打印就行。==时间复杂度O(n),空间复杂度S(1)==代码实现如下:
void PrintNumber(int n)
{
int number = 1;
int i = 0;
while (i++ < n)
number *= 10;
for (i = 1; i < number; i++)
printf("%d\t", i);
}
但是仔细想一想这个解法貌似有些错误。假设我们输入的n很大的时候,求最大的整数就连int,long long也无法存下。也就是我们所说的大数问题
2、方法2采用字符串或者数组来存放数字
- 采用字符串来存放数字,字符串里面的每个字符都是 ‘0’~‘9’ 之间的某一个字符。
- 数组的下标从0开始,所以每次从n-1开始计算,因为数字的存储方式是01,02,03,所以从后面开始,所以从个位开始时不用考虑进位,直接在原来的基础上+1即可。
- 没有进位表示一个这个数字存储完毕,直接break退出循环,进行下一次。存在进位表示没完,这时需要把个位处理为0,进位为1,n-2处理为1.
- 当i==0时进位,表示最高位已经溢出,这时结束
- 定义个字符串,保存数组的元素,最后转换为数字,存储到数组中。
代码实现如下:
vector<int> a;
bool isover(char* num, int n)
{
int carry = 0;//进位
bool over = false;//判断是否溢出
//从数组的第n-1位开始循环存储,因为数组下标从0开始
for (int i = n - 1; i >= 0; i--)
{
int temp = num[i] + carry -