C语言每日一题 ---- 打印从1到最大的n位数(Day 1)

本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。

博主csdn个人主页:小小unicorn
⏩专栏分类:C语言天天练
代码仓库:小小unicorn的代码仓库
关注我带你学习编程知识

Day1

  • 题目描述:
    • 解题思路:
    • 代码实现:
    • 结果情况:
  • 总结:

题目描述:

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

  1. 用返回一个整数列表来代替打印
  2. n 为正整数,0 < n <= 5

C语言每日一题 ---- 打印从1到最大的n位数(Day 1)_第1张图片

解题思路:

读完题目,基本思路大多数人想到的是是遍历数组,但有没有想过,这次与以往遍历有所不同,遍历数组的大小是由用户决定。那怎么解决呢?我们可以采取赋值的方式解决这个问题。

由此接口函数的返回值肯定是整个数组,所以我们采用int*作为该函数的返回值。

int* printNumbers(int n, int* returnSize ) 

int* returnSize:返回数组元素的个数。

函数传参首先需要知道用户求值(也就是题目问的),其次还要告诉返回数组元素的个数。

返回数组元素的个数怎么判断呢?举几个例子,你就明白了:

当输入1的时候,最大的 1位十进制数为9.
当输入2的时候,最大的 2位十进制数为99.
当输入3的时候,最大的 3位十进制数为999.

依次内推,我们可以观察出一个规律,返回值是10的n次方-1.
所以,我们可以用c语言中的pow函数来进行该操作。

*returnSize = pow(10, n) - 1;

既然返回一个数组并给这个数组还要进行赋值操作,数组的大小具体也不知道,为防止空间消耗,我们可以动态开辟一个数组。

int* arr = (int*)malloc(*returnSize * sizeof(int)); //malloc(字节数)

最后就是赋值操作了,这应该难不倒大家!

//赋值
    for (int i = 0; i < *returnSize ; ++i) 
    {
        *(arr + i) = i + 1;
    }

代码实现:

//*returnSize: 返回数组元素的个数;

int* printNumbers(int n, int* returnSize ) 
{
    //返回数组元素的个数
    *returnSize = pow(10, n) - 1;
    //动态分配空间
    int* arr = (int*)malloc(*returnSize * sizeof(int)); //malloc(字节数)
    //赋值
    for (int i = 0; i < *returnSize ; ++i) 
    {
        *(arr + i) = i + 1;
    }
    //返回
    return arr;
}

结果情况:

在这里插入图片描述
符合题目情况,问题得到解决。

总结:

以本题为例:当用遍历这个方法解决不了问题或被卡主是时,我们就用了赋值的方法。通过这道题会给我们一个启示,当我们解决问题时,用我们最容易想到的办法发现解决不了问题,我们就就可以尝试换另一种思路。

文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!

你可能感兴趣的:(c语言天天练,c语言,C语言每日一题,指针,算法)