分类 c语言 下的文章

大家好!这篇文章将带你一步步配置 Windows 上的 C++ 开发环境。这是为新手准备的详细教程,无论你之前有没有编程经验,都可以轻松跟随完成。我们将使用 MinGW-W64 作为编译器,Visual Studio Code (VSCode) 作为代码编辑器。让我们从下载工具开始!

第一步:下载 MinGW-W64 GCC 编译器

我们需要一个编译器来将 C++ 代码转换成计算机可以执行的程序。这里我们选择 MinGW-W64 GCC 8.1.0 作为我们的编译工具。

下载链接MinGW-W64 8.1.0

点击链接,下载这个压缩包。

第二步:解压 MinGW-W64

下载完成后,将压缩包解压到你电脑上的一个文件夹里,注意:确保文件夹路径中不要有空格或中文字符。比如可以直接解压到 C:\MinGW 这样的目录。

第三步:配置环境变量

接下来,我们需要让系统知道编译器的位置,这样以后我们就可以在任何地方使用它了。

  1. 在 Windows 搜索栏里输入 环境变量,点击“编辑系统环境变量”。
  2. 点击“环境变量”按钮。
  3. 在“系统变量”中,找到 Path,选中后点击“编辑”。
  4. 点击“新建”,在这里输入你刚才解压 MinGW 的路径,记得要包含 bin 文件夹,比如 C:\MinGW\bin
  5. 保存设置,点击“确定”退出所有窗口。

验证:打开命令提示符(按 Win + R,输入 cmd),然后输入 g++ --version,如果你看到类似 g++ (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 8.1.0 的输出,那么说明你已经成功配置好了。

第四步:安装 VSCode 和 C++ 插件

为了编写和运行 C++ 代码,我们需要一个编辑器。这里推荐使用 Visual Studio Code (VSCode),它轻量、强大且支持多种语言。

  1. 前往 VSCode官网 下载并安装 VSCode。
  2. 打开 VSCode,点击左侧的“扩展”图标(或按 Ctrl+Shift+X),搜索 C++
  3. 安装由微软提供的 C++ 插件,这会使 VSCode 具有 C++ 代码智能提示和调试功能。

第五步:编写第一个 C++ 程序

现在,我们来编写并运行我们的第一个 C++ 程序。

  1. 新建一个文件夹,比如 C:\MyCPPProjects,在 VSCode 中选择“打开文件夹”。
  2. 在这个文件夹中,新建一个文件,命名为 test.cpp
  3. test.cpp 中输入以下代码:

#include <iostream>

  

int main() {

    std::cout << "Hello, World!" << std::endl;

    return 0;

}
  1. 保存文件,然后按 F5 运行程序。第一次运行时,VSCode 会提示你选择调试配置,选择 g++ (编译并调试活动文件)
  2. 接下来会要求你选择编译器,选择 g++

第六步:完成配置并运行

现在,VSCode 会帮你编译并运行程序,如果一切顺利,你将在控制台中看到输出:


Hello, World!

恭喜你!你已经成功完成了 C++ 环境的搭建,并运行了你的第一个 C++ 程序。

常见问题解答

  1. 命令行找不到 g++

   - 请确保你在系统环境变量中正确添加了 MinGW 的 bin 目录。

  1. VSCode 无法找到编译器

   - 确保 MinGW 已经正确安装,并且系统环境变量配置无误。如果仍然有问题,尝试重启 VSCode 或重新配置环境。

结语

通过这篇教程,你已经学会了如何下载、安装并配置 MinGW-W64 作为 C++ 编译器,如何使用 VSCode 编写并运行 C++ 程序。希望你能够继续学习 C++,创造出更多有趣的项目。如果有任何问题,欢迎在评论区留言,我会尽力解答。

Happy coding!

一、n的二进制表示中第k位是几
第一步:将n右移k位,即 n >> k,把第k位移到最低位。
第二步:通过与运算获取最低位的值,即 n & 1,判断第k位是0还是1。

二、lowbit(x):返回x的最低位1及其后所有0所组成的数值

例如:
x = 1010(二进制) lowbit(x) = 10
x = 101000(二进制) lowbit(x) = 1000

原理:
lowbit(x) 的计算公式是 x & -x。

解释:

  • 首先,-x 等于 ~x + 1,这是二进制表示中取反加一的结果(即补码)。
  • 当我们将x与-x进行按位与运算时,结果会保留x中最低位的1,并将其他位清零。

举例说明:
x = 1010010101000
~x = 0101101010111
-x = ~x + 1 = 0101101011000(补码)
x & -x = 0000000001000

这表明lowbit(x) = 1000。

应用:
可以用lowbit(x)来计算x(二进制)中有多少个1。

puts("") 的作用是换行。

puts 函数是 C 标准库中的一个函数,用于将字符串输出到标准输出设备(通常是控制台),并在输出结束后自动换行。

其函数原型如下:

int puts(const char *str);

主要功能:

  1. 输出字符串puts 函数会将传入的字符串参数 str 输出到标准输出(通常是终端或控制台)。
  2. 自动换行:与 printf 不同的是,puts 函数在输出完字符串后会自动添加一个换行符(\n),因此你不需要手动加上换行。
  3. 返回值:如果输出成功,puts 返回一个非负值。如果发生错误,返回 EOF(表示 End of File 或错误)。

示例:

puts("Hello, World!");

输出为:

Hello, World!

(并且会自动换行)

区别:

  1. printf 不同,puts 只适用于输出 字符串,而不能像 printf 那样支持格式化输出(例如整型、浮点型等)。
  2. puts 函数在输出完毕后 自动换行,而 printf 需要你手动添加换行符 \n

所以puts("") 实际上是输出一个空字符串,然后自动换行。

在计算 (b!) 的末尾有多少个连续的0时,可以通过模拟阶乘的乘法来计算整个大数阶乘,再统计结果中末尾的0的数量。然而,当 (b) 很大时,这种直接模拟阶乘的方法会导致运行时间和空间效率较低,容易超时。

实际上,计算一个数的阶乘末尾有多少个0并不需要真的计算出整个阶乘。阶乘末尾0的数量实际上取决于阶乘中因子5的数量(因为2的数量总是比5多)。因此,可以采用数学方法来计算。

优化方法

计算 (b!) 末尾0的数量的核心在于统计从1到(b)中,能够被5整除的数的个数,以及更高次方(如25, 125, …)的个数。具体的公式为:

Pasted image 20240925122937.png
一直计算到 Pasted image 20240925123033.png

优化后的代码

#include<iostream>
using namespace std;

int main() 
{
    int b;
    cin >> b;
    int count = 0;
    for (int i = 5; i <= b; i *= 5) 
    {
        count += b / i;
    }
    cout << count << "\n";
    return 0;
}

解释

  1. i 从5开始,每次乘以5,直到 ( i > b ) 为止。
  2. b / i 表示当前阶乘数范围内包含多少个可以被当前的5次方整除的数。
  3. 将每一步的结果累加即可得到 (b!) 中因子5的总数,这就是末尾0的数量。

这种方法的时间复杂度是 (O(\log b)),相比原算法效率极高,能轻松处理非常大的 (b) 值,从而避免超时问题。

Pasted image 20240925103948.png
从截图中,可以看到程序虽然被正确接受(Accepted),但编译时出现了一些警告。主要问题如下:

警告信息

警告内容显示在以下位置:

warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]

原因

这些警告是因为在您的 for 循环中,使用了 int 类型的变量 istd::stringsize() 方法返回值进行比较。而 size() 方法的返回值是一个无符号整数类型 (std::string::size_type),通常是 size_t,在很多系统中定义为 long unsigned int。因此,当您用 int 类型的 i 和无符号的 size_t 进行比较时,编译器会提示这种有符号与无符号类型的比较可能导致潜在的问题。

解决方案

您可以将循环变量 i 的类型从 int 改为 std::string::size_type 或者 size_t,以确保类型一致。例如:

for (std::string::size_type i = 0; i < s1.size(); ++i) {
    // Your code
}

或者:

for (size_t i = 0; i < s1.size(); ++i) {
    // Your code
}

总结

虽然这些警告不会影响程序的运行,但为了代码的健壮性和可维护性,建议按照上述方法修改代码,消除这些警告。