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)。而红黑树是一种自平衡二叉搜索树,通过引入颜色标记(红色和黑色)来维…...

【C++ Primer Plus学习记录】指针——声明和初始化指针
指针用于存储值的地址,因此,指针名表示的地址。*运算符被称为间接值或解除引用运算符,将其应用于指针,可以得到该地址处存储的值。 例如,假设manly是一个指针,则manly表示的是一个地址,而*manl…...

切换至root用户时,命令提示符颜色为白色,如何修改?
当我切换至root用户时,发现命令提示符里的内容全部为白色,如图所示: 这让人看着不愉快,上网先搜索下解决方案:【切换到 root 账户字体全是白的,怎么改颜色啊】- 百度贴吧,但是这个解决方案只是…...

设计模式——17. 状态模式
1. 说明 状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态发生改变时改变其行为。状态模式将对象的状态封装成不同的状态对象,并将状态切换时的行为委托给当前状态对象。这样,对象在不同状态下具有不同的行为,而无需在对象本身中使用大量的条件语…...

系统架构设计:14 论软基于架构的软件设计方法(ABSD)的软件开发
目录 1 基于架构的软件设计(ABSD) 2 基于架构的软件开发过程 2.1 架构需求过程 2.2 架构设计过程</...

如何在 Spring Boot 中进行文件上传
在 Spring Boot 中进行文件上传 文件上传是Web应用程序中常见的功能之一,它允许用户将文件从客户端上传到服务器。Spring Boot提供了便捷的方式来处理文件上传,并且整合了Spring框架的强大功能,使文件上传变得相对简单。本文将介绍如何在Spr…...

Python 图形化界面基础篇:将应用程序打包为可执行文件
Python 图形化界面基础篇:将应用程序打包为可执行文件 引言 PyInstaller 简介步骤1:安装 PyInstaller 步骤2:创建 Python GUI 应用程序步骤3:使用 PyInstaller 打包应用程序 完整示例代码解释结论 引言 在开发完一个图形用户界面…...

Android 13.0 蓝牙遥控器确认键弹不出输入法的解决方法
1.概述 在android13.0设备定制化开发时,遥控器是使用红外遥控器,也有使用蓝牙遥控器的,所以出现的问题不一定相同,今天遇到个问题就是蓝牙遥控器在输入数据时弹不出输入法的问题 首选排除输入法的问题,安装其他的输入法,也是同样的问题,这样就确定是系统EditText控件相关…...

spring boot面试50问
目录 前言: 1. 什么是 Spring Boot? 2. 为什么要用SpringBoot? 3. SpringBoot与SpringCloud 区别? 4. Spring Boot 有哪些优点? 5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的࿱…...

条例24~25(设计与声明)
条例24 若所有参数皆需要类型转换,请为此采用非成员函数 有时候让类型内成员函数支持隐式类型转换是不妥善的。比如当我们想在类内实现operator *() 模拟乘法的时候。通常情况下表现良好,但若你想额外实现混合式运算。例如 int…...

Spring5应用之事务处理
作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…...