合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻
一、题目描述 ⭐️
二、解题思路 ⭐️
主要利用进位加法器的思想(将 小学时期就会的加法运算 转化成 计算机语言):(下面 以
a
为3
,n
为8
为例)
- 第1步、动态分配数组,然后从右往左,依次按列排序(从第
1
列到第8
列);- 第2步、遍历,然后分别计算每一列的和(
content
),比如:第1
列有8
个3
,则:content = 8 * 3=24
,以此类推;- 第3步、计算当前列的进位 和 当前列的余数:用
(content + 当前列的进位) / 10
和(content + 当前列的进位) % 10
【注意:(content + 当前列的进位) / 10
是下一列的进位哦,即第1
列的进位是0
】;- 第4步、如果最高位有进位,先输出最高位的进位;然后 从高位到低位输出余数(将获得余数 倒序输出);
- 第5步、释放动态分配的内存。
三、代码(C语言)⭐️
#include <stdio.h>
#include <stdlib.h> // 用于动态内存分配int main() {int a, n;scanf("%d %d", &a, &n);// 处理特殊情况:n为0时,直接输出0if (n == 0) {printf("0\n");return 0;}// 【关键】动态分配数组,大小为n+1,以容纳可能的最高位进位int *carryArr = (int *)calloc(n + 1, sizeof(int)); // 进位数组,初始化为0int *remainderArr = (int *)calloc(n + 1, sizeof(int)); // 余数数组,初始化为0// 计算每一位的和for (int j = n, i = 0; j > 0; j--, i++) {int content = j * a; // 当前位的值// printf("内容:%d ", content); // 当前位的值(当前列 相加 的 内容)// printf("进位:%d ",carryArr[i]); // 进位content += carryArr[i]; // 加上上一位的进位// 处理进位carryArr[i + 1] = content / 10; // 计算新的进位remainderArr[i] = content % 10; // 计算当前位的余数// printf("余数:%d\n",remainderArr[i]); // 余数}// 输出结果// 如果最高位有进位,先输出最高位的进位if (carryArr[n] != 0) {printf("%d", carryArr[n]);}// 从高位到低位输出余数for (int i = n - 1; i >= 0; i--) {printf("%d", remainderArr[i]);}printf("\n");// printf("\n"); 的作用是确保输出结果后换行,使程序的输出更加规范、清晰,并避免可能的意外行为。// 这是一种良好的编程习惯,建议在输出结果后始终添加换行符。// 释放动态分配的内存free(carryArr);free(remainderArr);return 0;
}
四、知识点 ⭐️
(一)、stdlib
的全称及功能
stdlib
的全称是Standard
Library
。🦋
- 在
C
语言中,stdlib
是标准库的缩写,提供了一组通用的函数,用于执行多种任务,包括内存分配(如malloc
、calloc
、free
)、程序控制(如exit
、abort
)、字符串处理(如atoi
、atof
、strtol
)等。
stdlib
库的主要功能:🦋
- 1、内存管理:提供内存分配和释放的函数,如
malloc
、calloc
和free
。- 2、程序控制:包含用于程序终止和异常处理的函数,如
exit
和abort
。- 3、字符串处理:提供字符串转换和操作的函数,如
atoi
、atof
、strtol
等。- 4、其他功能:还包括随机数生成、数学计算等功能。
(二)、malloc
和 calloc
之间的相同点和不同点
(1)、相同点:🍭
- 动态内存分配:
- 两者都用于在堆(
heap
)上动态分配内存。 - 分配的内存需要手动释放,使用
free()
函数。
- 两者都用于在堆(
- 返回指针:
- 两者都返回一个指向分配内存起始地址的
void*
指针。 - 如果分配失败,两者都返回
NULL
。
- 两者都返回一个指向分配内存起始地址的
- 需要包含头文件:
- 两者都需要包含
<stdlib.h>
头文件。
- 两者都需要包含
- 手动管理内存:
- 分配的内存不会自动释放,需要程序员手动调用
free()
来释放内存,否则会导致内存泄漏。
- 分配的内存不会自动释放,需要程序员手动调用
(2)、不同点:🍭
特性 | malloc | calloc |
---|---|---|
初始化 | 不初始化分配的内存,内容为随机值。 | 初始化分配的内存为 0 。 |
参数 | 接受一个参数:需要分配的总字节数。 | 接受两个参数:元素个数和每个元素的大小。 |
使用场景 | 适用于不需要初始化内存的场景。 | 适用于需要初始化内存为 0 的场景。 |
性能 | 较快,因为不需要初始化内存。 | 较慢,因为需要将内存初始化为 0。 |
语法 | void* malloc(size_t size); | void* calloc(size_t num, size_t size); |
// malloc
int *arr = (int *)malloc(10 * sizeof(int)); // 分配 10 个 int 大小的内存,内容未初始化
// calloc
int *arr = (int *)calloc(10, sizeof(int)); // 分配 10 个 int 大小的内存,并初始化为 0
(3)、总结:🍭
- 如果你需要分配内存并且希望初始化为
0
,使用calloc
。 - 如果你不需要初始化内存,或者需要手动初始化,使用
malloc
。 - 无论使用哪个函数,都要记得在不再需要内存时调用
free()
来释放内存,避免内存泄漏。
如若转载,请表明文章转载自此处哦,谢谢啦~ 😊 毕竟是我一笔一笔辛苦总结敲出来滴😭。希望可以帮助到大家哦❤️。