当前位置: 首页 > news >正文

【算法】二分查找,乘法口诀表,判断闰年,判断素数,使用函数实现数组操作

坚持用清晰易懂的图解+代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭:“不患无位,患所以立。”


C语言练习题

  • 前言
  • 目录
  • 一、二分查找
  • 二、乘法口诀表
  • 三、判断闰年
  • 四、判断素数
  • 五、函数实现数组操作

前言

🚀 你好,欢迎来到《编程闯关记》!
这里是算法与数据结构的实战基地,也是你从“暴力解法”到“最优解”的进化场。

🔍专栏初衷

  • 清晰的图解+多语言代码(Python/Java/C++/C),拆解每道题背后的逻辑。
  • 不只讲“怎么做”,更讲“为什么”——从题目分析、边界条件到复杂度优化。
  • 适合想夯实基础突击面试的你,尤其针对LeetCode/牛客高频题!

💡如何使用本专栏
1️⃣先独立思考:尝试自己写出第一版代码(哪怕很烂)。
2️⃣对比解法:看看我的思路和你的差异,吸收优化技巧。
3️⃣举一反三:每篇末尾会附相似题目链接,趁热打铁。

📌坚持打卡
算法没有捷径,但正确的方法能让你少走弯路。每天15分钟,和我一起用代码雕刻思维!

(正文开始👇)


目录

一、二分查找

写一个二分查找函数
功能:在一个升序数组中查找指定的数值,找到了就返回下标,找不到就返回-1.

二分查找是一种高效的搜索算法,仅适用于有序数组。它通过每次将搜索范围缩小一半来快速定位目标值。
算法步骤

  1. 初始化:定义左边界 left = 0,右边界 right = len - 1。

  2. 循环条件:当 left <= right 时,计算中间下标 mid。

  3. 比较目标值:
    若 arr[mid] == target,返回 mid。
    若 arr[mid] < target,缩小范围到右半部分(left = mid + 1)。
    若 arr[mid] > target,缩小范围到左半部分(right = mid - 1)。

  4. 未找到:循环结束后返回 -1。

    代码如下:

#include<stdio.h>intbinarySearch(intarr[],intlen,inttarget){intleft=0;intright=len-1;while(left<=right){intmid=left+(right-left)/2;// 避免溢出if(arr[mid]==target){returnmid;// 找到目标,返回下标}elseif(arr[mid]<target){left=mid+1;// 搜索右半部分}else{right=mid-1;// 搜索左半部分}}return-1;// 未找到}intmain(){intarr[]={1,3,5,7,9,11};intlen=sizeof(arr)/sizeof(arr[0]);inttarget=7;intresult=binarySearch(arr,len,target);if(result!=-1){printf("找到目标 %d,下标为 %d\n",target,result);}else{printf("未找到目标 %d\n",target);}return0;}

二、乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。

关键解析

  1. 对齐控制:
    使用 %-4d 格式化输出,确保每个结果占至少4位(左对齐),适应 11=1 到 1212=144 的宽度。
  2. 循环逻辑:
    外层循环 i 控制行(1到n),内层循环 j 控制每行的列(1到i)。

代码如下:

#include<stdio.h>voidprintMultiplicationTable(intn){for(inti=1;i<=n;i++){for(intj=1;j<=i;j++){printf("%d*%d=%-4d",j,i,i*j);// -4d保证至少占4位,左对齐}printf("\n");}}intmain(){intn;printf("请输入乘法口诀表的行数:");scanf("%d",&n);printMultiplicationTable(n);return0;}

三、判断闰年

实现函数判断year是不是润年。

闰年规则

  1. 普通闰年:能被4整除且不能被100整除。
  2. 世纪闰年:能被400整除。
  3. 其他情况:不是闰年。

关键解析

  1. 函数设计:
    输入:整数 year。
    返回值:true(闰年)或 false(非闰年)。
    逻辑表达式:
    (year % 4 == 0 && year % 100 != 0):处理普通闰年(如2004、2020)。
    (year % 400 == 0):处理世纪闰年(如2000)。
  2. 示例测试:
    输入:2000 → 输出:2000年是闰年。
    输入:1900 → 输出:1900年不是闰年。

代码如下:

#include<stdio.h>#include<stdbool.h>// 使用bool类型(C99标准)boolisLeapYear(intyear){// 逻辑判断return(year%4==0&&year%100!=0)||(year%400==0);}intmain(){intyear;printf("请输入年份:");scanf("%d",&year);if(isLeapYear(year)){printf("%d年是闰年\n",year);}else{printf("%d年不是闰年\n",year);}return0;}

四、判断素数

实现一个函数is_prime,判断一个数是不是素数。
利用上面实现的is_prime函数,打印100到200之间的素数。

关键解析

  1. is_prime 函数:
    输入:整数 n。
    逻辑:
    直接排除 ≤1 的数、偶数(除2)。
    只需检查 3 到 √n 之间的奇数因子。
  2. 主程序:
    遍历 100~200,调用 is_prime 筛选素数。
    输出结果以空格分隔。

为什么要用sqrt?

代码如下:

#include<stdio.h>#include<stdbool.h>#include<math.h>// 判断是否为素数boolis_prime(intn){if(n<=1)returnfalse;// 1和负数不是素数if(n==2)returntrue;// 2是唯一的偶素数if(n%2==0)returnfalse;// 排除其他偶数// 检查奇数因子,只需遍历到sqrt(n)for(inti=3;i<=sqrt(n);i+=2){if(n%i==0)returnfalse;}returntrue;}intmain(){intstart=100,end=200;printf("%d到%d之间的素数:\n",start,end);for(intnum=start;num<=end;num++){if(is_prime(num)){printf("%d ",num);}}printf("\n");return0;}

五、函数实现数组操作

创建一个整形数组,完成对数组的操作
实现函数init() 初始化数组为全0
实现print() 打印数组的每个元素
实现reverse() 函数完成数组元素的逆置。
要求:自己设计以上函数的参数,返回值。

代码解析

  1. init() 函数
    通过循环将数组的每个元素赋值为 0。

  2. print() 函数
    遍历数组并打印每个元素,用空格分隔,最后换行。

  3. reverse() 函数
    使用双指针法(首尾指针),交换元素直到中间相遇。

  4. 时间复杂度:
    O(n/2)
    O(n/2)(高效)。

  5. main() 函数
    测试三个功能:打印原始数组 → 逆置 → 初始化 → 打印结果。

#include<stdio.h>// 1. 初始化数组为全0voidinit(intarr[],intlen){for(inti=0;i<len;i++){arr[i]=0;}}// 2. 打印数组元素voidprint(intarr[],intlen){for(inti=0;i<len;i++){printf("%d ",arr[i]);}printf("\n");}// 3. 逆置数组元素voidreverse(intarr[],intlen){intleft=0;// 首元素下标intright=len-1;// 末元素下标while(left<right){// 交换首尾元素inttemp=arr[left];arr[left]=arr[right];arr[right]=temp;left++;right--;}}intmain(){intarr[5]={1,2,3,4,5};// 测试数组intlen=sizeof(arr)/sizeof(arr[0]);// 计算数组长度printf("原始数组:");print(arr,len);reverse(arr,len);printf("逆置后数组:");print(arr,len);init(arr,len);printf("初始化后数组:");print(arr,len);return0;}
http://www.jsqmd.com/news/761353/

相关文章:

  • [Langchain网页抓取与天气查询实战]MCP篇
  • MATLAB强化学习工具箱实战:手把手教你用Q-Learning和SARSA通关5x5网格世界
  • 多模态文本到图像生成技术评测框架解析
  • 2026年工业级程序提取技术全解析:单片机破解、多层板抄板、嵌入式开发、工控设计、汽车电子设计、电路方案开发、硬件设计选择指南 - 优质品牌商家
  • Axiomtek AIE900-XNX边缘AI系统解析与应用指南
  • 在多轮对话应用中感受Taotoken聚合端点的响应连贯性
  • 大语言模型角色漂移问题分析与解决方案
  • 别再用记事本看DICOM了!用Python+pydicom一键提取患者信息和影像参数(附完整代码)
  • MLP孪生网络在无人机实时追踪中的创新应用
  • 2026成都本地可靠旅行社TOP5:成都纯玩旅行社、成都靠谱旅行社、成都周边一日游、成都周边两日游、成都周边亲子游选择指南 - 优质品牌商家
  • 为AI智能体集成临时邮箱:基于MCP协议的自动化验证解决方案
  • 别只盯着XGBoost!用逻辑回归和决策树也能搞定天猫复购预测(特征工程是关键)
  • React-Redux反模式:10个常见错误和终极避坑指南
  • 青龙面板在安卓手机跑不起来?可能是SSH和BusyBox没配好(附问题排查清单)
  • javascript新手福音:用快马平台生成可交互代码示例快速入门
  • 掌握Atom代码折叠快捷键:提升代码阅读效率的10个必备技巧
  • Linux内存取证神器Rekall:5个关键插件使用详解
  • Overleaf排版进阶:除了graphicx,这些宏包能让你的论文图表更专业(subcaption, float, caption实战)
  • Open UI5 源代码解析之1334:hasTag.js
  • 安卓demo-折叠屏平行视界适配(embedding方案)
  • 2026PCBA清洗机怎么选:离线清洗机、过炉治具清洗机、LED清洗机、PCBA在线水洗机、PCB在线清洗机、PCB清洗机选择指南 - 优质品牌商家
  • 如何在Vue Element Admin中实现全局异常捕获与友好提示:完整指南
  • 【限时解密】Dify农业专属调试工具箱V2.3:含土壤墒情校准插件、农机轨迹纠偏SDK及36小时应急响应通道(仅开放至本季度末)
  • 30岁男性BMI26原子化科学减腰围的庖丁解牛
  • Web AI服务API化:逆向工程与FastAPI实战指南
  • Storeon:180字节的终极状态管理解决方案 - 为什么你应该放弃Redux?
  • 【数据结构与算法】—顺序表(续)
  • 新手入门pid控制:用快马平台生成交互式教学代码理解参数调节
  • AWS EC2实例类型从t3.medium升级到t3.large怎么做?具体步骤有哪些?
  • 从摄像头到HDMI:手把手教你用Zynq-7000玩转视频缩放与拼接(含资源评估与移植指南)