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

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)

✅作者简介&#xff1a;大家好我是&#xff1a;侠客er&#xff0c;是一名普通电子信息工程专业的大学学生&#xff0c;希望一起努力&#xff0c;一起进步&#xff01; &#x1f4c3;个人主页&#xff1a;侠客er &#x1f525;系列专栏&#xff1a;C语言刷题练习 &#x1f3f7;️…...

docker- harbor私有仓库部署与管理

什么是 harbor harbor是一个开源的云原生镜像仓库&#xff0c;它允许用户存储、签名、和分发docker镜像。可以将 harbor 看作是私有的docker hub &#xff0c;它提供了更新安全性和控制性&#xff0c;让组织能够安全的存储和管理镜像 harbor RBAC&#xff08;基于角色访问控制…...

自动化测试的优缺点

自动化测试的优势 能够极大地提升测试的效率&#xff0c;测试人员可以迅速地在指定平台部署测试脚本且对相应功能进行测试。 “弱化”了软件测试人员个体差异对测试结果的影响。 提高整个测试团队的技能水平。 自动化测试的缺陷 自动化测试的缺陷在于&#xff1a;总是按照…...

深度学习基础知识 Dataset 与 DataLoade的用法解析

深度学习基础知识 Dataset 与 DataLoade的用法解析 1、Dataset2、DataLoader参数设置&#xff1a;1、pin_memory2、num_workers3、collate_fn分类任务目标检测任务 1、Dataset 代码&#xff1a; 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的加密包&#xff0c;有时候我们需要解密这个包来查看协商数据。如何来解密这样的包? 首先导出strongswan协商生成的各种key. 要能导出这些key&#…...

算法进阶-搜索

算法进阶-搜索 题目描述&#xff1a;给定一张N个点M条边的有向无环图&#xff0c;分别统计从每个点除法能够到达的点的数量 **数据规模&#xff1a;**1 < n < 3e4 **分析&#xff1a;**这里我们可以使用拓扑排序根据入边对所有点进行排序&#xff0c;排序后我们按照逆序&…...

时空智友企业流程化管控系统 sessionid泄露漏洞 复现

文章目录 时空智友企业流程化管控系统 sessionid泄露漏洞 复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 时空智友企业流程化管控系统 sessionid泄露漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从…...

QT编程,QMainWindow、事件

目录 1、QMainWindow 2、事件 1、QMainWindow QMenuBar&#xff1a;菜单栏 QMenu: 菜单 QAction: 动作 QToolBar: 工具栏 QStatusBar: 状态栏 setWindowTitle("主窗口"); //: 前缀 文件名 setWindowIcon(QIcon(":/mw_images/10.png")); resize(640, 4…...

人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用

大家好&#xff0c;我是微学AI ,今天给大家介绍一下人工智能在教育上的应用2-基于大模型的未来数学教育的情况与实际应用&#xff0c;随着人工智能(AI)和深度学习技术的发展&#xff0c;大模型已经开始渗透到各个领域&#xff0c;包括数学教育。本文将详细介绍基于大模型在数学…...

C++学习day5

目录 作业&#xff1a; 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部分使用方法&#xff0c;如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时&#xff0c;设置了条件判断如正则表达式&#xff0c;若用户输入的数据不合法&#xff0c;则添加失败并提示用户错误的地方&#xff0c;便于用户修…...

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邮箱账号 写在前面&#xff1a; 要注意&#xff0c;注册Google邮箱必须要确保自己能够 科学上网&#xff0c;如果暂时做不到&#xff0c;请先进行相关学习。使用的手机号是大陆&#xff08;86&#xff09;的。 在保证自己能够科学上网后&#xff0c;在浏…...

docker版jxTMS使用指南:数据采集系统的高可用性

本文讲解4.6版jxTMS中数据采集系统的高可用性&#xff0c;整个系列的文章请查看&#xff1a;4.6版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 4.2版jxTMS的说明&#xff…...

vue如何禁止通过页面输入路径跳转页面

要禁止通过页面输入路径跳转页面&#xff0c;你可以使用Vue Router的导航守卫&#xff08;navigation guards&#xff09;来拦截导航并阻止不希望的跳转。 下面是一种常见的方法&#xff0c;你可以在全局导航守卫&#xff08;global navigation guards&#xff09;中实现这个功…...

mac,linux环境的基础工具安装【jdk,tomcat】

安装 一 linux环境一&#xff09;、JDK安装卸载&#xff1a; 二&#xff09;、 tomcat 安装1、[下载](https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.63/bin/apache-tomcat-8.5.63.tar.gz)后&#xff0c;在目录 /usr/local/tomcat下&#xff0c;解压缩2、配置tomca…...

chrome窗口

chrome 窗口的层次&#xff1a; 父窗口类名&#xff1a;Chrome_WidgetWin_1 有两个子窗口&#xff1a; Chrome_RenderWidgetHostHWNDIntermediate D3D Window // 用于匹配 Chrome 窗口的窗口类的前缀。 onst wchar_t kChromeWindowClassPrefix[] L"Chrome_WidgetWin_…...

某快递公司Java一面

1.平衡二叉树和红黑树的区别&#xff1f; 平衡二叉树是一种二叉搜索树&#xff0c;其左子树和右子树的高度差不超过1&#xff0c;以确保在最坏情况下的查找效率是O(log n)。而红黑树是一种自平衡二叉搜索树&#xff0c;通过引入颜色标记&#xff08;红色和黑色&#xff09;来维…...

gallery性能分析工具:找出本地AI平台的性能瓶颈

gallery性能分析工具&#xff1a;找出本地AI平台的性能瓶颈 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/GitHub_Trending/gallery44/gallery 在…...

OpenClaw人人养虾:macOS 开发环境设置

本指南介绍从源代码构建和运行 OpenClaw macOS 应用所需的步骤。 前置条件 在构建应用之前&#xff0c;请确保已安装以下工具&#xff1a; Xcode 26.2&#xff1a;Swift 开发所需。Node.js 22 和 pnpm&#xff1a;gateway、CLI 和打包脚本所需。 1. 安装依赖 安装项目级依…...

智能编程伙伴:让快马ai辅助你优化与调试keil嵌入式项目代码

智能编程伙伴&#xff1a;让快马AI辅助你优化与调试Keil嵌入式项目代码 最近在Keil MDK环境下开发STM32G474RET6的精密数据采集系统时&#xff0c;遇到了ADC采样噪声大和实时性不足的问题。作为一个嵌入式开发者&#xff0c;这些问题直接影响系统的精度和响应速度。通过使用In…...

Kook Zimage真实幻想Turbo常见问题解决:生成全黑图?显存不足?看这篇就够了

Kook Zimage真实幻想Turbo常见问题解决&#xff1a;生成全黑图&#xff1f;显存不足&#xff1f;看这篇就够了 你是不是已经迫不及待地部署好了Kook Zimage真实幻想Turbo&#xff0c;准备大展身手创作奇幻大片&#xff0c;结果一运行&#xff0c;要么生成一张全黑的图片&#…...

雷达信号处理中的‘模糊函数’到底是什么?用Python仿真LFM信号的距离多普勒耦合现象

雷达信号处理中的‘模糊函数’到底是什么&#xff1f;用Python仿真LFM信号的距离多普勒耦合现象 雷达信号处理中&#xff0c;匹配滤波器的性能直接影响目标检测的精度。当目标存在径向运动时&#xff0c;回波信号会产生多普勒频移&#xff0c;导致匹配滤波器出现失配。描述这种…...

【多机器人路径规划】基于MRPP或MAPF的多机器人路径规划算法研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

黑丝空姐-造相Z-Turbo入门:Git版本控制下的模型项目管理

黑丝空姐-造相Z-Turbo入门&#xff1a;Git版本控制下的模型项目管理 你是不是也遇到过这种情况&#xff1f;团队里几个人一起调一个AI模型&#xff0c;今天你改了下提示词&#xff0c;明天他更新了模型参数&#xff0c;结果谁也不知道哪个版本的效果最好。或者&#xff0c;辛辛…...

Windows 一键安装OpenClaw 教程|全流程无代码无需输命令

OpenClaw Windows 专属本地安装包 &#xff0c;全程图形化、无需代码、自带依赖&#xff0c;支持微信 / 企业微信 / 钉钉 / 飞书一键联动&#xff0c;本地运行更安全。 一、安装前准备 系统&#xff1a;Windows 10/11 64 位内存&#xff1a;≥8GB必须关闭&#xff1a;360、火…...

如何快速掌握MaterialSkin:打造现代化WinForms界面的终极指南

如何快速掌握MaterialSkin&#xff1a;打造现代化WinForms界面的终极指南 【免费下载链接】MaterialSkin Theming .NET WinForms, C# or VB.Net, to Googles Material Design Principles. 项目地址: https://gitcode.com/gh_mirrors/ma/MaterialSkin 你是否厌倦了传统Wi…...

3分钟搞定!BaiduPCS-Web免费解锁百度网盘满速下载终极方案

3分钟搞定&#xff01;BaiduPCS-Web免费解锁百度网盘满速下载终极方案 【免费下载链接】baidupcs-web 项目地址: https://gitcode.com/gh_mirrors/ba/baidupcs-web 还在为百度网盘下载速度慢如蜗牛而烦恼吗&#xff1f;每次下载大文件都要等上几个小时甚至一整天&#…...