算法基础(C/C++版)

C/C++实现阿姆斯特朗数算法:从数学原理到代码优化 在编程算法学习中,数字处理与数学运算是基础且核心的技能。其原理在于对整数进行位分解与幂运算,通过循环控制实现特定数学逻辑。掌握这项技术对于提升代码效率、理解算法复杂度至关重要,广泛应用于算法竞赛、面试题解及数学问题编程求解等场景。本文以经典的阿姆斯特朗数(Armstrong Number)为例,深入剖析其数学定义,并提供了清晰的C/C++实现方案,涵盖从基础循环、函数封装到性能优化的完整路径。针对常见的浮点数精度陷阱和边界条件,文中给出了详细的调试技巧和避坑指南,例如使用整数连乘法替代pow函数以避免精度损 阅读详情

第零章 程序=数据结构+算法?

我们在上程序设计的第一节课的时候,老师就提到了一个概念:程序=数据结构+算法,那么什么是数据结构?什么是算法呢?数据结构研究的是数据在计算机中是以什么方式进行排列组合的;算法研究的是通过什么过程达到最终目的的。

算法是解决问题的特定步骤或明确序列。一个高效的算法可以帮助我们用更少的时间解决十分复杂的问题,而低效的算法则可能花费更多的时间成本和经济成本。这就是我们学习算法的原因。

第一章 交换和排序

1.1 交换

交换算法是一个十分简单的算法,它可以让我们交换两个变量的值。交换算法的基本格式如下(假设我们已经定义a和b并赋初值)

int temp=a;
a=b;
b=temp;

这三句话就完成了交换的算法。

原理如下所述:
首先,用一个临时变量temp存储a的值,此时temp的值是原来a的值;
然后,把b的值赋值给a,此时a的值为原来b的值;
最后,把temp(原来a的值)赋值给b,此时b的值就是原来a的值。

这样,我们就完成了一次a和b的交换。
当然,C++的algorithm库中内置了swap函数,可以直接交换a和b的值。
代码如下:

#include<algorithm>
swap(a,b);
交换算法的别样操作
1.加减法运算(有风险)
a=a+b;
b=a-b;
a=a-b;

提示有风险的原因是加法运算在计算a+b的时候有溢出风险,或者浮点数精度问题导致最后结果可能不是你想要的。

2.乘除法运算(风险比加减法运算更大)

因为除法对于整数的处理是向下取整的,所以不准确的概率会更大,不建议使用。

3. 位运算(无风险,但只适用于整数)
a=a^b;
b=a^b;
a=a^b;

说明:^符号为按位异或运算符,规则为将a和b转化为二进制后,二进制位计算相同的为0,不同的为1。
举个例子:
当a为1,b为2时,a^b的值为3
理由如下(为方便理解,这里采用4位二进制作为示例):
a=1 (0001)
b=2 (0010)
(0001)^(0010)=(0011)=3(记住相同为0,不同为1)

切入正题,在以上的代码中,建议使用临时变量temp存储的算法,尽管它使用了额外的空间。(或者直接用C++的swap(a,b))

1.2 排序

排序算法有很多种,如冒泡排序、选择排序、插入排序、快速排序等。
首先最简单也是最易于理解的就是冒泡排序,代码如下所示:

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n-1; i++) {         // 外层循环控制遍历的轮数
        for (j = 0; j < n-i-1; j++) {   // 内层循环控制每一轮的比较和交换
            if (arr[j] > arr[j+1]) {   // 比较相邻两个元素
                // 交换元素
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}

冒泡排序的优点就是语法简单,但是缺点就是:太!慢!了!(冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2))
参考快速排序的算法( O ( n log ⁡ n ) O(n \log n) O(nlogn))

第二章 增删查改

2.1 尾增

纯C语言

#include<stdio.h>
#include<stdlib.h>
struct Array
{
	int* arr;
	int pos;
};
int main()
{
	struct Array a;
	int n;
	scanf("%d",&n);
	a.arr=(int*)malloc(n*sizeof(int));
	a.pos=0;
	for(int i=0;i<n;i++)
	{
		int x;
		scanf("%d",&x);
		*(a.arr+a.pos)=x;
		a.pos++;
	}
	free(a.arr);
	return 0;
}

C++

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> arr;
	int n;
	cin >> n;
	for(int i=0;i<n;i++)
	{
		int x;
		cin >> x;
		arr.push_back(x);
	}
	return 0;
}

2.2 尾删

纯C语言

#include<stdio.h>
int main()
{
	int arr[10]={1,2,3,4,5};
	int len = 5;
	if(len>0)
	{
		len--;
		printf("删除成功\n");
	}
	else
	{
		printf("数组长度为0,无法删除\n");
	}
}

尾删只需要控制数组长度就行
C++用pop_back();来实现vector数组的尾删

2.3 查询

无论是C语言还是C++,顺序表直接查询时间复杂度都是O(1)(下标访问)
对于查找一个特定的目标来说,平均的时间复杂度为O(n)(遍历整个数组)

for(int i=0;i<len;i++)
{
	if(arr[i]==target)
	{
		answer=target;
		break;
	}
}

对于一个有序数组来说,时间复杂度可以降到O(log n)(二分查找)

#include <stdio.h>

// 二分查找函数
int binarySearch(int arr[], int size, int target) {
    int left = 0;
    int right = size - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;  // 防止整数溢出
        
        if (arr[mid] == target) {
            return mid;  // 找到目标,返回索引
        } else if (arr[mid] < target) {
            left = mid + 1;  // 目标在右半部分
        } else {
            right = mid - 1;  // 目标在左半部分
        }
    }
    
    return -1;  // 未找到目标
}

int main() {
    int arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};
    int size = sizeof(arr) / sizeof(arr[0]);
    int target = 23;
    
    int result = binarySearch(arr, size, target);
    
    if (result != -1) {
        printf("元素 %d 在数组中的索引是 %d\n", target, result);
    } else {
        printf("元素 %d 不在数组中\n", target);
    }
    
    return 0;
}

第三章 算法竞赛常用算法

3.1 前缀和&差分

前缀和算法就是用一个新数组存储原数组在这个下标之前所有值的和
差分就是用一个数组存储arr[n]-arr[n-1]的值

前缀和算法的C语言表述如下:

int arr[len], prex[len];
prex[0]=arr[0];
for(int i=1,i<len;i++)
{
	prex[i]=prex[i-1]+arr[i];
}

差分算法的C语言表述如下:

int arr[len], diff[len];
diff[0]=arr[0];
for(int i=1;i<len;i++)
{
	diff[i]=arr[i]-arr[i-1];
}

3.2 双指针

双指针算法使用的首要条件是数组有序。
双指针的一个用法是解决两数之和问题(LeetCode第一题 两数之和)
核心方法是通过指针间的位置关系和移动准则,压缩查找范围,消除暴力解法中的无效计算。

C语言代码如下:

//假设数组升序
int l=0,r=len-1;
while(l<r)
{
	if(arr[l]+arr[r]==target)
	{
		//找到目标
		break;
	}
	else if(arr[l]+arr[r]<target) l++;
	else r--;
}

通过双指针算法,可以将时间复杂度从原来的暴力解法(两个for循环) O ( n 2 ) O(n^2) O(n2)降低到 O ( n ) O(n) O(n)。

Dev-C++ 2026中文环境配置全指南:C/C++零基础入门实战 Dev-C++作为轻量级C/C++集成开发环境,是初学者理解编译、链接与调试全流程的理想起点。其底层基于MinGW-w64 GCC 13.2.0和GDB 14.1,原生支持C++23标准,技术价值在于降低学习认知负荷——无需配置PATH、跳过CMake复杂语法、规避VS Code多层JSON设置。核心应用场景覆盖高校编程导论、ACM算法训练及课程设计开发,尤其在中文路径兼容、UTF-8源码处理、控制台中文字符输出等关键环节提供可落地的三重编码锚定方案。本文聚焦真实教学验证的Win11适配、GCC版本识别、中 阅读详情

相关推荐

C/C++算法概述

1. 性能优势:C/C++语言以其接近硬件的特性而著称,提供了对底层硬件的直接控制能力。这意味着算法可以实现更高的执行效率,特别是在需要处理大量数据或实时性能要求较高的场景中。C/C++提供了丰富的数据结构和操作,允许开发者以灵活的方式实现复杂的算法。同时,C++的面向对象特性使得算法的模块化和重用变得更加容易。3. 跨平台兼容性:C/C++程序可以在多种操作系统和硬件平台上编译和运行,这使得算法实现具有很好的可移植性。4. 广泛的应用基础。

2401_86771711的博客 1467

C++和算法入门——1

C++和算法入门

m0_55303420的博客 921

C/C++基础语法

C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。 希望能与大家一起交流讨论编程的魅力 加群:590750544 (群里有编程...

weixin_45820912的博客 2409

C++算法基础

x在 l 和 mid 之间 则 r = mid-1 [l, mid - 1];x在 mid 和 r 之间 则 l = mid [mid, r];①确定分界点 q[l] q[(l+r)/2] q[r] ★。②递归排序left right 左右两个数组。①确定分界点 mid = (l+r)/2。②调整区间 下标i j 分别从两边遍历。③归并排序 合二为一 ★。

hurricane777777的博客 573

RedPanda-CPP:超轻量C/C++ IDE的安装配置与实战指南

集成开发环境(IDE)是提升编程效率的核心工具,它通过整合代码编辑、编译、调试等功能,为开发者提供一站式解决方案。其工作原理在于将底层工具链(如编译器、调试器)与用户界面无缝衔接,实现代码的高效构建与问题定位。在C/C++开发领域,一个优秀的IDE能显著降低环境配置复杂度,尤其对于教学、嵌入式验证等场景。RedPanda-CPP正是这样一款专注于轻量与开箱即用的IDE,它内置编译器管理和图形化调试支持,解决了传统配置繁琐的痛点。通过极简的安装流程和清晰的CMake项目管理,开发者可以快速搭建开发环境,专注于

weixin_33940469的博客 421

精通LeetCode C/C++:算法与编程技巧大全

LeetCode 是一个面向软件工程师的在线编程平台,它为求职者、开发者和爱好者提供了一个练习、展示和提升编程技能的空间。平台的核心是提供大量的算法题,这些题目覆盖了从基础知识到高级算法各个难度等级,涵盖多种编程语言。用户可以通过在线编写代码,并在限定时间内提交以测试代码的正确性。LeetCode 还拥有一个活跃的社区,用户可以在社区中分享解题思路、讨论问题以及查看其他人的解决方案。函数是一段具有特定功能的代码块,可以被多次调用。在C/C++中,函数需要声明其返回类型和参数列表。例如:a : b;

weixin_29138345的博客 1233

C++之算法入门

C++之算法入门: 本文介绍:最大公约数和最小公倍数、单链表、直接插入排序,作为抛砖引玉吧。 一、最大公约数和最小公倍数

cnds123的专栏 3192

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

【分享】一些经典的C/C++语言基础算法及代码(一)

阅读到的一些经典C/C++语言算法及代码。在此分享。 1、计算Fibonacci数列 Fibonacci数列又称斐波那契数列、黄金分割数列:1、1、2、3、5、8、13、21…… C语言实现代码: 代码 1 #include int main() { int count, n, t1 = 0, t2 = 1, display = 0; printf("Enter number

Orient 1万+

高通camera驱动 camx read xml 和 probe 流程 和 sensor I2C读写的波形图 (三)

Camx 刚接触的时候对于这个xml 一脸懵逼,实际上和mm-camera差不多就是以xml node节点的方式标准化了driver相关的code,exposure 和 gain的逻辑实现还是在同级目录的cpp中,并且将 xml 的解析工作放在了 out/target/<product>/gen/STATIC_LIBERARIES/libcamxgenerated_intermediates/generated/ 中主要是包含了: g_chromatix : tuning 相关xml的解析co

shangbolei的博客 1万+

【基金量化研究系列】基金绩效归因模型——Brinson多期归因模型

文章目录1. 引言2. Brinson单期归因模型2.1 模型框架2.2 公式推导3. Brinson多期归因模型3.1 模型框架3.2 公式推导4. Brinson模型的应用场景4.1 基金组合归因4.2 基金经理能力刻画4.3 大类资产配置应用5. 模型的实现与实证案例研究写在最后 1. 引言 在 2. Brinson单期归因模型 2.1 模型框架 wp wb rp 组合收益:wp rp 择股收益:wb rp rb 择时收益:wp rb 基准收益:wb rb 2.2 公式推

Mikey_Sun的博客 1万+

C++基础(第一章:基础算法)

第一章:基础算法

善良的小乔的博客 534

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 547

【大连理工大学】C/C++程序设计基础A课程设计(2025版)[2025-05-13]

大连理工大学的C/C++程序设计基础A课程设计(2025版)要求学生开发一个名为“大工新时代杰出成就统计与查询系统”的应用程序。该设计任务包括五个主要功能:任务选项功能、数据输入功能、文件操作功能、算法与信息统计功能以及数据输出功能。设计要求程序采用模块化设计,包括主函数和子函数,并鼓励使用图形用户界面如easyX或QT。此外,程序需要具备良好的用户交互界面、数据存储与文件操作能力、以及多种数据输出格式。实验报告需详细说明选题意义、系统功能、程序结构、核心数据设计、函数说明、设计难点及解决方法,以及运行效果

程序设计 413

AI原生应用评测:主流大语言模型性能对比

任务适配性:是否匹配应用的核心任务(如代码生成需强逻辑推理,内容创作需强创意性);上下文能力:处理长序列(如10万+字文档)的理解与生成能力;可靠性:幻觉(Hallucination)率、事实准确性、安全合规性;性价比:API调用成本、延迟、 scalability(扩展能力)。AI原生应用的核心是LLM与应用场景的深度协同。

架构师的AI之路,分享AI应用开发架构的学习与实践。 507

C++(Qt)软件调试---内存分析工具Heob(26)

绝对最全面最详细的Heob使用说明。(图文并茂) 绝大部分的文章都说Heob是一个内存泄漏分析工具,其实Heob只是内存泄漏分析功能比较突出,实际上Heob可以分析很多内存问题。 Heob是一个Windows下检测缓冲区溢出(野指针、空指针、内存越界、重复释放、异常捕获等)和内存泄漏的工具,集成到Qt Creator中,功能强大,简单容易上手。

mahuifa的博客 4313

C/C++ 算法基础

我们以简单程序Hello World为例说明程序的基本框架。此程序在屏幕上输出一行“Hello World!}这段程序包括二个部分:1.#include #include是C语言的保留字,表示要把另一个文件中的内容包含在本文件中。是被包含的文件的文件名。C语言中提供了一些可以被直接拿来使用、能够完成某些特定功能的库函数,分别声明于不同的头文件中。例如:stdio.h中定义了一些与输入输出有关的函数。

纵横千里 捭阖四方 的专栏 1万+

STM32N6570-DK识别STLINK问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2211

C/C++实现快排算法

1.快排的实现逻辑: 先从数列中取出一个数作为基准数(通常取第一个数)。 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 再对左右区间重复第二步,直到各区间只有一个数。 2.示意图 3.C/C++代码实现 void quickSort(int *array, int left, int right) { if(left < right) { ...

starzyh的博客 3万+

Simulink开发项1000例实战专栏--实例38:基于Simulink的周波变换器(Cycloconverter)

需求分析周波变换器(Cycloconverter),也称为频率变换器或直接变频器,是一种将输入的固定频率交流电直接转换为不同频率的交流电的电力电子设备。它广泛应用于工业领域,如大功率电机驱动、风力发电、船舶推进系统等场合。与传统的间接变频器(如交-直-交变频器)相比,周波变换器具有更高的效率和更简单的结构,适用于需要低频输出的应用场景。

xiaoheshang_123的博客 335

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C/C++ 基础复习及补充

C 到 C++ 基础 本文章仅为个人学习,如有错误之处请指正。

weixin_45705044的博客 1392

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

适合c/c++新手学习的一些项目,别给我错过了!

俗话说:万事开头难,学习编程也是,在c/c++项目实战群里,经常遇到有小伙伴询问编程语言如何入门方面的问题,如: 我要学习C或者C++语言,有什么开源项目可以推荐吗? 我是某编程语言的新手,有什么练手的项目推荐吗? 等等 自己在摸索前进的朋友可以进群973961276来一起学习,缺乏项目实战经验的同学可以看这里c/c++ 企业级项目实战,文末附了一份c/c++入门学习大纲,不过可能有点不清晰,需要清晰版的请评论区留言或者进群获取 See,这就是本系列文章的由来,我们希望学习c/c++语言的同学们,.

linuxguitu的博客 3285

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C/C++ 技术面试基础知识总结

???? Github    |    ???? Docsify 简体中文    |    English ???? 关于 ???? 本仓库是面向 C/C++ 技术方向校招求职者、初学者的基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。 ???? 侧边目录支持方式:???? Docsify 文档、Github + TOC 导航(TOC预览.png) ???? 保存为 PDF 方式:使用 Chrome 浏览器打开 ???? Docsify

ccf19881030的专栏 2195

【C/C++ 基础算法】 C/C++ 位图算法的使用

位图算法(Bitmap Algorithm)是一种在计算机科学和数据结构中用于高效地管理位(bit)的算法。它通常用于快速检索和存储数据。位图算法在内存使用上非常高效,因为它每个元素只使用一个位。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 390

Dijkstra 算法的 C/C++ 实现

Dijkstra算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,是广度优先算法的一种,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。其基本原理是:每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个

chengonghao的博客 1万+
上一篇: Java基础语法
下一篇: Python基础语法
Tianshang301
博客等级 码龄2年 50粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值