主页 > 开源代码  > 

2025-03-03学习记录--C/C++-PTA7-38数列求和-加强版

2025-03-03学习记录--C/C++-PTA7-38数列求和-加强版

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、题目描述 ⭐️

二、解题思路 ⭐️

主要利用进位加法器的思想(将 小学时期就会的加法运算 转化成 计算机语言):(下面 以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时,直接输出0 if (n == 0) { printf("0\n"); return 0; } // 【关键】动态分配数组,大小为n+1,以容纳可能的最高位进位 int *carryArr = (int *)calloc(n + 1, sizeof(int)); // 进位数组,初始化为0 int *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)、不同点:🍭 特性malloccalloc初始化不初始化分配的内存,内容为随机值。初始化分配的内存为 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() 来释放内存,避免内存泄漏。

如若转载,请表明文章转载自此处哦,谢谢啦~ 😊 毕竟是我一笔一笔辛苦总结敲出来滴😭。希望可以帮助到大家哦❤️。

标签:

2025-03-03学习记录--C/C++-PTA7-38数列求和-加强版由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“2025-03-03学习记录--C/C++-PTA7-38数列求和-加强版