C语言刷题练习(Day2)
✅作者简介:大家好我是:侠客er,是一名普通电子信息工程专业的大学学生,希望一起努力,一起进步!
📃个人主页:侠客er
🔥系列专栏:C语言刷题练习
🏷️非常欢迎大家在评论区留言交流,互相学习!
前言
(1)今天给大家分享两个非常有意思的题目,通过较长时间的研究,我觉得个人理解得算比较透彻了,与大家分享一下。
(2)第一道题主要考查浮点数的运算,第二道题主要考查ascii码的巧用,以及字符串数组和整型数组的基础知识,虽然基础,但很是重要。
(3)如果大家有不同的解法,欢迎在评论区中交流。

第一题
求一串式子的值。上面题目有误,正确题目应该是1-1/4+1/7-1/10……
通过观察式子很容易发现规律,分母每次加3,第一个数n=0,极性取决于(-1)的n次方,于是我们调用a的b次方函数pow(a,b),也不忘记包含它的math.h头文件,问题可以迎刃而解。
#define _CRT_SECURE_NO_WARNINGS 1//1-1/4+1/7+1/10。。。
#include <stdio.h>
#include <math.h>
int main()
{int n = 0;float sum = 0.0f;float a = 0.0f;printf("请输入n=\n",n);scanf("%d",&n);for (int i = 0; i <= n; i++){a = (float)(1.0f / (float)(1 + 3 * i));sum = pow(-1,i)* a + sum;}printf("求和的结果是%f",sum);return 0;
}
> 易错点:-1的n次方千万不能写成:(-1)n,在c语言中是异或操作的意思。
本道题还有其他很多方法,下面再列举几种方法。
方法二:
# include <stdio.h>
int main(void)
{int i = 1;int j = 1;double sum = 0; //结果肯定是小数, 所以要定义成double或float型while (1.0/i > 1e-6) /*当1/i小于10的-6次方时停止循环。这个循环条件是自己定的, 定得越小最后的结果就越精确。注意1一定要写成小数的形式即1.0*/{sum += (1.0 / i) * j;i+=2;j = -j; //实现正负交替}sum *=4;printf("sum = %lf\n", sum); //double是%lf, 取6位小数是%.6return 0;
}
第二题
求大数的阶乘。
在解决求大数的阶乘这个问题之前,我们先通过解决求大数加法这一问题进行引入,解决大数加法的问题,大数的阶乘会更加简单。
大数的加法
以前我们写加法都是:
#include<stdio.h>
int main()
{int a,b;scanf("%d %d",&a,&b);printf("%d",a+b);return 0;
}
对于比较小的数字可能还可以计算,但是对于超出整形范围(-2147483648~2147483647(
)的数字,可能就没有办法了。
为了解决这个问题,我们采取运用字符串数组来巧妙地计算大数。
先来看一个程序预热,下面代码的作用是将输入的字符串转化为整型打印出来。
int main()
{int i = 0,tmp = 0;char a[11] = { 0 }; //如果从i =10开始遍历的话,定义数组时要定义到大小为11,负责遍历到没有定义的元素,数组会溢出char b[11] = { 0 };scanf("%s",a);for (tmp = 0, i = strlen(a) - 1; i >= 0; i--)b[tmp++] = a[i] - '0'; // ASCII码里面字符数字转化为对应的十进制的数字,可以用%d打印数字// 输出结果for (i = 10; i >= 0; i--) //如果从i =10开始遍历的话,定义数组时要定义到大小为11,负责遍历到没有定义的元素,数组会溢出{if (b[i] != 0) {for (i; i >= 0; i--){printf("%d", b[i]);}//这里用不着break,到这的时候i已经等于0了,执行到这以后,i=0;在执行大for循环地i--后,不再满足大for循环的条件,直接退出循环// break;}}return 0;
}
下面带来大数加法的程序。
#include<stdio.h>
#include<string.h>
#define MAXLEN 10000 //定义求和结果的最大位数
int main()
{int i, up, tmp;char buffer[MAXLEN + 1] = { 0 }, a[MAXLEN + 1] = { 0 }, b[MAXLEN + 1] = { 0 };//逆序输入ascanf("%s", buffer);for (tmp = 0, i = strlen(buffer) - 1; i >= 0; i--)a[tmp++] = buffer[i] - '0'; // ASCII码里面字符数字转化为对应的十进制的数字,可以用%d打印数字//逆序输入bscanf("%s", buffer);for (tmp = 0, i = strlen(buffer) - 1; i >= 0; i--)b[tmp++] = buffer[i] - '0'; // ASCII码里面字符数字转化为对应的十进制的数字,可以用%d打印数字if (a[0] == 0 && b[0] == 0) // 这是加数都为零的情况{printf("0");return 0;}//计算for (up = 0, i = 0; i < MAXLEN; i++){tmp = a[i] + b[i] + up; // 暂时存储数值a[i] = tmp % 10;up = tmp / 10; // 进位}// 输出结果for (i = MAXLEN; i >= 0; i--){if (a[i] != 0){for (i; i >= 0; i--){printf("%d", a[i]);}//break;//这个break其实用不着,此时i已经等于0了}}return 0;
}
注意点:
(1)我们先来复习一下strlen函数的基础知识。
a、strlen是求字符串长度的函数,不能求整型数组的长度。
b、看看strlen求字符串长度的返回值。
int main()
{char a[] = "1234";printf("%d", strlen(a)); //结果是4return 0;
}
(2)数字字符数组不能直接通过%d去打印数组里的每一个数字。
//这样是不对的
int main()
{int i = 0, tmp = 0;char a[10] = { 0 };scanf("%s", a);for (i = strlen(a) - 1; i >= 0; i--){printf("%d",a[i]);}return 0;
}
(3)数字字符数组要转化为数字打印出来需要这样操作
int main()
{char a[10] = {0};int b[10] = { 0 };int i,tmp;scanf("%s",a);for (tmp = 0, i = strlen(a) - 1; i >= 0; i--)b[tmp++] = a[i] - '0'; // ASCII码里面字符数字转化为对应的十进制的数字,可以用%d打印数字printf("%d",b[1]);return 0;
}
或者
int main()
{int i = 0,tmp = 0;char a[11] = { 0 }; //如果从i =10开始遍历的话,定义数组时要定义到大小为11,负责遍历到没有定义的元素,数组会溢出char b[11] = { 0 };scanf("%s",a);//逆序输入bfor (tmp = 0, i = strlen(a) - 1; i >= 0; i--)b[tmp++] = a[i] - '0'; // ASCII码里面字符数字转化为对应的十进制的数字,可以用%d打印数字// 输出结果for (i = 10; i >= 0; i--) //如果从i =10开始遍历的话,定义数组时要定义到大小为11,负责遍历到没有定义的元素,数组会溢出{if (b[i] != 0) {for (i; i >= 0; i--){printf("%d", b[i]);}//这里用不着break,到这的时候i已经等于0了,执行到这以后,i=0;在执行大for循环地i--后,不再满足大for循环的条件,直接退出循环// break;}}return 0;
}
(4)整型数组不能用数组名打印,只有字符数组才能用数组名打印,整型数组只能一个一个数组元素打印。
(5)打印字符串数组时,for循环通常这样搭配
//这样搭配的
//tmp = 0, i = strlen(buffer) - 1;
//tmp = 1, i = strlen(buffer);
(6)字符数组元素转整型元素后的加法运算,a[i]与b[i]已转化为整型元素
// //计算 数组的第一位,即两个数的个位 初始进位值up = 0 计算出来应该要逆向输出 这是一个计算的好法子for (up = 0, i = 0; i <= len; i++){tmp = a[i] + b[i] + up; // 暂时存储数值result[i] = tmp % 10;up = tmp / 10; // 进位}
(7)在使用数组时,一定要注意数组空间大小的申请,避免访问数组以外的元素导致出现栈溢出
(8)注意数组的初始化操作还有sizeof与strlen的区别
例一
char arr1[]={'H','E','L','L','O'};
char arr2[]="HELLO";
sizeof(arr1); //返回5
sizeof(arr2); //返回6,因为最后有一个'\0'
例二
char *str1 = "asdfgh";
char str2[] = "asdfgh";
char str3[8] = {'a', 's', 'd'};
char str4[] = "as\0df";
输出结果是
sizeof(str1) = 4; strlen(str1) = 6;
sizeof(str2) = 7; strlen(str2) = 6;
sizeof(str3) = 8; strlen(str3) = 3;
sizeof(str4) = 6; strlen(str4) = 2;
sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。
看下面代码及其输出结果
int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。int len1 = sizeof(arr1) / sizeof(arr1 [0]);int len2 = sizeof(arr2) / sizeof(arr2 [0]);int len3 = sizeof(arr3) / sizeof(arr3 [0]);int len4 = sizeof(arr4) / sizeof(arr4 [0]);int len5 = sizeof(arr5) / sizeof(arr5 [0]);printf("length arr1 = %d\n", len1);printf("length arr2 = %d\n", len2);printf("length arr3 = %d\n", len3);printf("length arr4 = %d\n", len4);printf("length arr5 = %d\n", len5);
运行结果

大数阶乘
先贴代码
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
#include<string.h>
#define MAXLEN 100 //定义阶乘结果的最大位数
int main()
{int n, i, j, up, tmp;char arr[MAXLEN + 1] = { 1 }; //最开始arr[0] = 1,用1来乘// 输入nscanf("%d", &n);//计算 //arr[0]保存结果的个位,arr[1]保存结果的十位,以此类推for (i = 2; i <= n; i++){for (up = 0, j = 0; j <= MAXLEN; j++){tmp = arr[j] * i + up; arr[j] = tmp % 10;up = tmp / 10;}}// 输出结果 逆序输出for (i = MAXLEN; i >= 0; i--)if (arr[i] != 0)for (i; i >= 0; i--)printf("%d", arr[i]);return 0;}
代码分析
(1)代码实现思路是:
以计算5!为例,我们的运算思路是1乘2乘3乘4乘5,以此得到运算结果为2,6,24,120。我们巧妙通过arr[0],arr[1],arr[2]来存放运算结果的个位、十位和百位,实现代码如下:
//计算 //arr[0]保存结果的个位,arr[1]保存结果的十位,以此类推for (i = 2; i <= n; i++){for (up = 0, j = 0; j <= MAXLEN; j++){tmp = arr[j] * i + up; arr[j] = tmp % 10;up = tmp / 10;}}
(2)结果的输出:由于我们在计算过程中是将各位逆序存入数组的,所以我们也像大数的加法一样逆序输出结果。
// 输出结果 逆序输出for (i = MAXLEN; i >= 0; i--)if (arr[i] != 0)for (i; i >= 0; i--)printf("%d", arr[i]);
(3)#define MAXLEN 100 //定义阶乘结果的最大位数
arr[MAXLEN + 1]数组用来存放运算结果。
相关文章:
C语言刷题练习(Day2)
✅作者简介:大家好我是:侠客er,是一名普通电子信息工程专业的大学学生,希望一起努力,一起进步! 📃个人主页:侠客er 🔥系列专栏:C语言刷题练习 🏷️…...
docker- harbor私有仓库部署与管理
什么是 harbor harbor是一个开源的云原生镜像仓库,它允许用户存储、签名、和分发docker镜像。可以将 harbor 看作是私有的docker hub ,它提供了更新安全性和控制性,让组织能够安全的存储和管理镜像 harbor RBAC(基于角色访问控制…...
自动化测试的优缺点
自动化测试的优势 能够极大地提升测试的效率,测试人员可以迅速地在指定平台部署测试脚本且对相应功能进行测试。 “弱化”了软件测试人员个体差异对测试结果的影响。 提高整个测试团队的技能水平。 自动化测试的缺陷 自动化测试的缺陷在于:总是按照…...
深度学习基础知识 Dataset 与 DataLoade的用法解析
深度学习基础知识 Dataset 与 DataLoade的用法解析 1、Dataset2、DataLoader参数设置:1、pin_memory2、num_workers3、collate_fn分类任务目标检测任务 1、Dataset 代码: import torch from torch.utils import dataclass MyDataset(torch.utils.data.D…...
【ElasticSearch】深入探索 DSL 查询语法,实现对文档不同程度的检索,以及对搜索结果的排序、分页和高亮操作
文章目录 前言一、Elasticsearch DSL Query 的分类二、全文检索查询2.1 match 查询2.2 multi_match 查询 三、精确查询3.1 term 查询3.2 range 查询 四、地理坐标查询4.1 geo_bounding_box 查询4.2 geo_distance 查询 五、复合查询5.1 function score 查询5.2 boolean 查询 六、…...
使用wireshark解密ipsec ISAKMP包
Ipsec首先要通过ikev2协议来协商自己后续协商所用的加解密key以及用户数据的esp包用的加解密包。 ISAKMP就是加密过的ike-v2的加密包,有时候我们需要解密这个包来查看协商数据。如何来解密这样的包? 首先导出strongswan协商生成的各种key. 要能导出这些key&#…...
算法进阶-搜索
算法进阶-搜索 题目描述:给定一张N个点M条边的有向无环图,分别统计从每个点除法能够到达的点的数量 **数据规模:**1 < n < 3e4 **分析:**这里我们可以使用拓扑排序根据入边对所有点进行排序,排序后我们按照逆序&…...
时空智友企业流程化管控系统 sessionid泄露漏洞 复现
文章目录 时空智友企业流程化管控系统 sessionid泄露漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 时空智友企业流程化管控系统 sessionid泄露漏洞 复现 0x01 前言 免责声明:请勿利用文章内的相关技术从…...
QT编程,QMainWindow、事件
目录 1、QMainWindow 2、事件 1、QMainWindow QMenuBar:菜单栏 QMenu: 菜单 QAction: 动作 QToolBar: 工具栏 QStatusBar: 状态栏 setWindowTitle("主窗口"); //: 前缀 文件名 setWindowIcon(QIcon(":/mw_images/10.png")); resize(640, 4…...
人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用
大家好,我是微学AI ,今天给大家介绍一下人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用,随着人工智能(AI)和深度学习技术的发展,大模型已经开始渗透到各个领域,包括数学教育。本文将详细介绍基于大模型在数学…...
C++学习day5
目录 作业: 1> 思维导图 2> 多继承代码实现沙发床 1>思维导图 2> 多继承代码实现沙发床 #include <iostream>using namespace std; //创建沙发类 class sofa { private:string sitting; public:sofa(){cout << "sofa的无参构造函数…...
1.软件开发-HTML结构-元素剖析
元素的嵌套 代码注释 ctrl/ URL url 统一资源定位符 一个给定的独特资源在web上的地址 URI...
QTableWidget 表格增删数据
QTableWidgetQTableWidgetQTableWidget部分使用方法,如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时,设置了条件判断如正则表达式,若用户输入的数据不合法,则添加失败并提示用户错误的地方,便于用户修…...
Tableau:商业智能(BI)工具
Tableau入门 1、Tableau概述2、Tableau Desktop2.1、初识Tableau Desktop2.2、Tableau工作区2.3、数据窗格与分析窗格2.4、功能区和标记卡2.4.1、列和行功能区2.4.2、标记卡2.4.3、筛选器功能区2.4.4、页面功能区2.4.5、附加功能区、图例、控件 3、Tableau视图4、Tableau工作簿…...
【gmail注册教程】手把手教你注册Google邮箱账号
手把手教你注册Google邮箱账号 写在前面: 要注意,注册Google邮箱必须要确保自己能够 科学上网,如果暂时做不到,请先进行相关学习。使用的手机号是大陆(86)的。 在保证自己能够科学上网后,在浏…...
docker版jxTMS使用指南:数据采集系统的高可用性
本文讲解4.6版jxTMS中数据采集系统的高可用性,整个系列的文章请查看:4.6版升级内容 docker版本的使用,请查看:docker版jxTMS使用指南 4.0版jxTMS的说明,请查看:4.0版升级内容 4.2版jxTMS的说明ÿ…...
vue如何禁止通过页面输入路径跳转页面
要禁止通过页面输入路径跳转页面,你可以使用Vue Router的导航守卫(navigation guards)来拦截导航并阻止不希望的跳转。 下面是一种常见的方法,你可以在全局导航守卫(global navigation guards)中实现这个功…...
mac,linux环境的基础工具安装【jdk,tomcat】
安装 一 linux环境一)、JDK安装卸载: 二)、 tomcat 安装1、[下载](https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.63/bin/apache-tomcat-8.5.63.tar.gz)后,在目录 /usr/local/tomcat下,解压缩2、配置tomca…...
chrome窗口
chrome 窗口的层次: 父窗口类名:Chrome_WidgetWin_1 有两个子窗口: Chrome_RenderWidgetHostHWNDIntermediate D3D Window // 用于匹配 Chrome 窗口的窗口类的前缀。 onst wchar_t kChromeWindowClassPrefix[] L"Chrome_WidgetWin_…...
某快递公司Java一面
1.平衡二叉树和红黑树的区别? 平衡二叉树是一种二叉搜索树,其左子树和右子树的高度差不超过1,以确保在最坏情况下的查找效率是O(log n)。而红黑树是一种自平衡二叉搜索树,通过引入颜色标记(红色和黑色)来维…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
CSS3相关知识点
CSS3相关知识点 CSS3私有前缀私有前缀私有前缀存在的意义常见浏览器的私有前缀 CSS3基本语法CSS3 新增长度单位CSS3 新增颜色设置方式CSS3 新增选择器CSS3 新增盒模型相关属性box-sizing 怪异盒模型resize调整盒子大小box-shadow 盒子阴影opacity 不透明度 CSS3 新增背景属性ba…...
[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...
