C语言练习7(巩固提升)

news2024/11/19 18:32:50

C语言练习7

    • 编程题

前言
“芳林新叶催陈叶,流水前波让后波。”改革开放40年来,我们以敢闯敢干的勇气和自我革新的担当,闯出了一条新路、好路,实现了从“赶上时代”到“引领时代”的伟大跨越。今天,我们要不忘初心、牢记使命,继续以逢山开路、遇水架桥的开拓精神,开新局于伟大的社会革命,强体魄于伟大的自我革命,在我们广袤的国土上继续书写13亿多中国人民伟大奋斗的历史新篇章!

编程题

,输入一个整数,将这个整数以字符串的形式逆序输出,程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001。
数据范围: 1 <= n <= 2^30 - 1
输入描述:输入一个int整数。
输出描述:将这个整数以字符串的形式逆序输出。

OJ链接【牛客网题号: HJ11 数字颠倒】【难度:简单】
示例:
输入:1516000
输出:0006151

💡分析:

这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成

🔑 代码实现
//HJ11 数字颠倒
int main()
{
	int num = 0;
	while (~scanf("%d", &num))//输入一个数字
	{
		if (num == 0)//若等于0则直接打印
		{
			printf("%d", num);
			continue;
		}
		while (num > 0)//若大于零%10得到个位
		{
			printf("%d", num % 10);
			num /= 10;//去掉取出的数
		}
	}
	return 0;
}

💯运行结果:
在这里插入图片描述

二,对字符串中的所有单词进行倒排。
说明:
1、构成单词的字符只有26个大写或小写英文字母;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只
允许出现一个空格间隔符;
4、每个单词最长20个字母;

OJ链接【牛客网题号: HJ31 单词倒排】【难度:简单】
示例:
输入:I am a student
输出:student a am I

💡分析:

这道题的解题思路不难,定义一个字符指针数组,用于保存每个单词的起始字符地址,接下来将非字母字符全部替换成为字符串结尾标志,则单词字符字母遇到结尾就结束了,相当于把一个字符串以非字母字符进行切割成为了多个字符串,最终对字符指针数组进行逆序打印每个单词即可。

🔑 代码实现
#include <stdio.h>
#include <string.h>
//HJ31 单词倒排
int main()
{
	char str[10001] = { 0 };//字符串最长10000
	int row = 0;
	while (gets(str) > 0) {
		char* ptr = str;
		char* word[10000] = { NULL };
		while (*ptr != '\0') 
		{
			//如果是个字母字符,则是单词的起始字符
			if (('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A')) 
			{
				word[row++] = ptr;//保存每个单词的起始地址
				//把本次的单词字母字符走完,直到遇到非字母字符
				while (*ptr != '\0' &&
					(('z' >= *ptr && *ptr >= 'a') || ('Z' >= *ptr && *ptr >= 'A'))) 
				{
					ptr++;
				}
				continue;//不能继续向下,因为下边的ptr++会跳过当前的非字母字符
			}
			*ptr = '\0';//把非字母的数据全部替换为结尾标志
			ptr++;
		}
		for (int i = row - 1; i >= 0; i--)
		{
			printf("%s ", word[i]);//针对所有单词的起始地址逆序开始打印即可
		}
		printf("\n");
	}
}

💯运行结果:
在这里插入图片描述

三,1、给定一个二进制数组, 计算其中最大连续 1 的个数。

leetcode【 leetcode 题号:485. 最大连续 1 的个数】【难度:简单】
示例:
输入:[1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3

💡分析:

这道题思路比较简单,统计连续1的个数,遇到0时表示连续中断,判断如果当前的统计数大于之前最大的则替换,然后继续下一个位置开始的统计即可。

🔑 代码实现
intndMaxConsecutiveOnes(int* nums, int numsSize)
{
	int max_count = 0;
	int cur_count = 0;
	int i = 0;
	for (i = 0; i < numsSize; i++)
	{
		if (nums[i] == 1)
		{
			cur_count++;
		}
		else
		{
			max_count = max_count > cur_count ? max_count : cur_count;
			cur_count = 0;
		}
	}
	max_count = max_count > cur_count ? max_count : cur_count;
	return max_count;
}

四,求输出n以内(含n)完全数的个数。完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
注意:本题输入含有多组样例。
输入描述:输入一个数字n
输出描述:输出不超过n的完全数的个数

OJ链接【牛客网题号: HJ56 完全数计算】【难度:简单】
示例:
输入:1000 7 100
输出:3 1 2

💡分析:

🔑 代码实现
int is_perfect_num(int num)
{
	int sum = 1;
	int i = 0;
	for (i = 2; i <= sqrt(num); i++)
	{
		if (num % i == 0)
		{
			sum += i;
		if (i != sqrt(num))
			sum += num / i;
		}
	}
	if (sum == num)
		return 1;
	return 0;
}
int main()
{
	int n = 0;
	while (~scanf("%d", &n))
	{
		int count = 0;
		int i = 0;
		for (i = 2; i <= n; i++)
		{
			if (is_perfect_num(i))
			{
				count++;
			}
		}
		printf("%d\n", count);
	}
	return 0;
}

💯运行结果:
在这里插入图片描述

五,给你一个含 n 个整数的数组 numvs ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出
现在 nums 中的数字,并以数组的形式返回结果。

leetcode【 leetcode 题号:448. 找到所有数组中消失的数字】【难度:简单】
示例:
输入:nums = [4,3,2,7,8,2,3,1]
输出:[5,6]
输入:nums = [1,1]
输出:[2]

💡分析:

numsSize 大小的数组,其中每个元素的数据在 [1, numsSize] 区间之内,解法其实并不复杂,以数组元素的绝对值作为下标,将对应位置的数据置为负数,比如 0 号位置是 3 ,则把 3 号位置的数据重置为负值,等到数组遍历重置完毕,只有缺失的这个数字对应的位置保留正数,其他出现过的数字位置都会是负数, 要注意不要重复设置负数,因为负负得正。
示例:
[2, 3, 3, 2, 4] 注意数组10个元素,值为[1-10], 但是访问下标应该在[0-9]之内,因此修改位置下标应该是值-1
0号元素是2,则将1号位置置为对应负值 [2, -3, 3, 2, 4]
1号元素是3,则将2号位置置为对应负值 [2, -3, -3, 2, 4]
2号元素是-3,绝对值为3,将2号位置为负值,但是2号位已经重置过,不需要重置,否则会变正数[2, -3, -3, 2, 4]
3号元素是-2,绝对值为2,将1号位置为负值,但是1号位已经重置过,不需要重置,否则会变正数[2, -3, -3, 2, 4]
4号元素是4,则将3号位置置为对应负值 [2, -3, -3, -2, 4]
遍历数组得到0,4两个位置的数据是大于0的,因为人家数值从1开始,因此+1后得到1, 5两个缺失的数字

🔑 代码实现
int*ndDisappearedNumbers(int* nums, int numsSize, int* returnSize) 
{
	for (int i = 0; i < numsSize; i++)
	{
		if (nums[abs(nums[i]) - 1] > 0)
			nums[abs(nums[i]) - 1] = -(nums[abs(nums[i]) - 1]);
	}
	int* ret = (int*)malloc(sizeof(int) * (numsSize));
	*returnSize = 0;
	for (int i = 0; i < numsSize; i++)
	{
		if (nums[i] > 0) 
		{
			ret[*returnSize] = i + 1;
			*returnSize += 1;
		}
	}
	return ret;
}

六,写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
数据范围:两个数都满足 0≤n≤1000

OJ链接【牛客网题号: JZ65 不用加减乘除做加法】【难度:简单】
示例:
输入:1,2
返回值:3

💡分析:

十进制相加思想: 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位嘛),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。
这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用 + 符号
二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0 得 0 , 1+1 进位得 0 , 1+0 得 1 ),使用异或可以取得; 然后计算相加的进位结果(同 1 的位置左移一位即可),使用相与后左移取得。
示例:
5 0101 + 7 0111
不考虑进位的相加结果 0101^0111 -> 0010
相加的进位 0101&0111 -> 0101 因为进位左移得到 1010
1010 + 0010
不考虑进位的相加结果 1010 ^ 0010 -> 1000
相加的进位 1010 & 0010 -> 0010 因为进位左移得到 0100
1000 + 0100
不考虑进位的相加结果 1000 ^ 0100 -> 1100
相加的进位 1000 & 0100 -> 0000 进位为0结束运算

🔑 代码实现
int Add(int num1, int num2) 
{
	while (num2 != 0) 
	{//进位不为0则持续与相加结果进行相加
		int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
		num2 = (num1 & num2) << 1;//同1的位相加则会进位
		num1 = tmp;
	}
	return num1;
}

七,给你一个长度为 n 的整数数组 nums ,其中 n > 1 ,返回输出数组 output ,其中 output[i] 等于 nums 中除nums[i] 之外其余各元素的乘积。
提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

leetcode【 leetcode 题号:238. 除自身以外数组的乘积】【难度:中等】
示例:
输入: [1,2,3,4]
输出: [24,12,8,6]

💡分析:

🔑 代码实现
int Add(int num1, int num2) 
{
	while (num2 != 0) 
	{//进位不为0则持续与相加结果进行相加
		int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
		num2 = (num1 & num2) << 1;//同1的位相加则会进位
		num1 = tmp;
	}
	return num1;
}

八,自除数 是指可以被它包含的每一位数除尽的数。例如, 128 是一个自除数,因为 128 % 1 == 0 , 128 % 2 ==0 , 128 % 8 == 0 。还有,自除数不允许包含 0 。给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。

leetcode【 leetcode 题号:728. 自除数】【难度:简单】
示例:
输入:上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]

💡分析:

暴力不考虑其他的因素的话,将所有数据乘积起来,然后遍历数组除以当前位置数据即可。
更优解法:将乘积分为两次进行,第一次先将每个位置左边的数据乘积计算出来放到返回数组中,后边第二次循环将对应位置右边的数据乘积计算出来与返回数组对应位置的左半边乘积相乘得到结果。
示例: 一个数组 int nums[ ] = {2, 3, 4} 。
int left = 1, right = 1;
计算左侧乘积:
第0个元素的左边乘积, arr[0] = left 然后计算第1位左侧乘积 left*=nums[0] -> left = 12
第1个元素的左边乘积, arr[1] = left 然后计算第2位左侧乘积 left
=nums[1] -> left = 123
第2个元素的左边乘积, arr[2] = left 然后计算第3位左侧乘积 已经没必要了,因为第2元素是末尾元素了
一次循环完毕后,返回数组中每个元素存储的都是自己左侧元素的乘积。 arr[]中的值: [1, 2, 6]
计算右侧乘积:
第2个元素的右边乘积, arr[2] = right 然后计算第1位右侧乘积 right=nums[2] -> right =14
第1个元素的右边乘积, arr[1] = right 然后计算第0位右侧乘积 right=nums[1] -> right =1
43
第0个元素的右边乘积, arr[0] = right 然后计算第-1位右侧乘积 -1位已经不需要计算了
循环完毕后,返回数组中的每个元素都是其他元素的乘积了 arr[2]
=1; arr[1]
=4; arr[0]*=12

🔑 代码实现
int* selfDividingNumbers(int left, int right, int* returnSize) 
{
	int* ret = (int*)calloc(1000, sizeof(int));//动态申请足够大的空间用于存放返回的自除数
	*returnSize = 0;
	for (int i = left; i <= right; i++) {
		int num = i;
		while (num) {
			int remainder = num % 10;//计算余数
			if (remainder == 0 || (i % remainder) != 0) {//判断i自身与余数取模是否为0
				break;
			}
			num /= 10;
		}
		//如果num==0表示通过了每一位数的取模判断,则i就是自除数
		if (num == 0) ret[(*returnSize)++] = i;
	}
	return ret;
}

💘后期会推出更多C语言练习题,希望大家与我共同进步,早日成为大佬!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/955647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作中提高CSS的编写效率,可以多用这三个CSS伪类

:where 基本使用 :where() CSS 伪类函数接受选择器列表作为它的参数&#xff0c;将会选择所有能被该选择器列表中任何一条规则选中的元素。 以下代码&#xff0c;文本都会变成 yellow 颜色 :where(div p) span {color: yellow; }<div class"test-div"><…

如何为你的公司选择正确的AIGC解决方案?

如何为你的公司选择正确的AIGC解决方案&#xff1f; 摘要引言词汇解释&#xff08;详细版本&#xff09;详细介绍1. 确定需求2. 考虑技术能力3. 评估可行性4. 比较不同供应商 代码快及其注释注意事项知识总结 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&…

微信8.0.41更新来了,看看有哪些变化吧

微信给我们带来了极大的方便&#xff0c;无论是日常聊天还是工作沟通&#xff0c;几乎离不开它。 时不时会给我一种熟悉的陌生感。 这个功能&#xff0c;好像我之前是没见过的。 就比如公众号信息流&#xff0c;刷着刷着就会发现&#xff0c;怎么会有看一看的信息推流会突然出现…

C语言控制语句——循环语句

什么是循环 重复执行代码 为什么需要循环 循环的实现方式 whiledo…whilefo while语句 语法格式&#xff1a; while (条件) {循环体…… }需求&#xff1a;跑步5圈 示例代码&#xff1a; #include <stdio.h>int main() {// 需求跑步5圈// 1. 条件变量的定义int i 1;…

golang入门笔记——nginx

文章目录 Nginx介绍Nginx的安装Nginx文件Nginx反向代理负载均衡nginx动静分离URLRewrite防盗链nginx高可用配置安全性Nginx限流Nginx缓存集成Lua脚本OpenRestry Nginx介绍 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占用内存少&#xff0c;并发能力强&#x…

15-数据结构-二叉树的遍历,递归和非递归

简介&#xff1a; 本文主要是代码实现&#xff0c;二叉树遍历&#xff0c;递归和非递归&#xff08;用栈&#xff09;。主要为了好理解&#xff0c;直接在代码处&#xff0c;加了详细注释&#xff0c;方便复习和后期默写。主要了解其基本思想&#xff0c;为后期熟练应用…

plsql ebs 工作中的简单笔记

工作流中给系统界面发送消息&#xff1a; PROCEDURE wf_notify(p_sender IN VARCHAR2 DEFAULT SYSADMIN,p_receiver IN VARCHAR2,p_subject IN VARCHAR2,p_content_text IN VARCHAR2);PROCEDURE wf_notify(p_sender IN VARCHAR2 DEFAULT SYSADMIN,---发送…

模块和包(Python语言)

目录 一、什么是模块&#xff1f; 二、模块导入方式 2.1方法一&#xff1a; 2.2方法二&#xff1a; 2.3模块导入搜索路径&#xff1a; 2.4模块调用格式&#xff1a; 三、OS模块操作文件 四、模块的操作 4.1模块作用&#xff1a; 4.2模块分类&#xff1a; 4.3魔术变量…

EXSI技术--Exsi资源分割

我们在搭建好环境之后,就类似于有了一个服务器,现在我们就可以对着一个服务器进行一个虚拟化的操作。给不同的用户使用操作。现在,有一个名叫mit的科技企业需要租用服务器用于创建MySQL数据库集群;另外还有一个IECQ的企业需要服务器搭建电商平台。下面我们为这两个企业分割…

进程Start

Linux中的命令解释器和Windows的程序管理器explorer.exe一样地位,都是在用户态下运行的进程 共享变量发生不同进程间的指令交错&#xff0c;就可能会数据出错 进程只作为除CPU之外系统资源的分配单位 CPU的分配单位是线程 每个进程都有自己的独立用户空间 内核空间是OS内核的…

提高工作效率的一键查询和保存大量快递物流信息的技巧

在如今快速发展的电商行业中&#xff0c;物流服务的准确与便捷是保证顺利交付商品的重要环节。为了方便用户追踪物流&#xff0c;固乔快递查询助手应运而生。这款软件不仅能够快速查询快递单号的物流信息&#xff0c;还具备保存查询结果的功能&#xff0c;方便用户随时查看。 首…

光伏电站、变电站、等直流系统电参量测量仪器怎么选型

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 应用场景 工作拓扑图 功能 ①对电能参数进行采样计量和监测&#xff0c;逆变器或者能量管理系统&#xff08;EMS&#xff09;与之进行通讯&#xff0c;根据实时功率及累计电能实现防逆流、调节发电量、电池充放电等功能&#xff1b; ②…

初始化列表

文章目录 一. 初始化列表是什么&#xff1f;二. 为什么要有初始化列表&#xff1f;三. 初始化列表的特性四. explicit关键字五. statis成员六. 友元七. 内部类八. 匿名对象九. 编译器优化总结&#xff1a; 一. 初始化列表是什么&#xff1f; 初始化列表是构造函数真正初始化的地…

基于stm32的烟雾浓度检测报警proteus仿真设计(仿真+程序+讲解)

基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解&#xff09; 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 基于STM32的烟雾浓度检测报警仿真设计(仿真程序讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&a…

Python编程

Lesson I 解rar压缩包的密码 1 下载Python并安装 网址: 注意选对是32 bit还是64 bit Python Releases for Windows | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/windows/ 2 安装unrar pip install unrar 3 下载u…

JS中方法、函数、属性是一个东西吗

在 JavaScript 中&#xff0c;方法、函数和属性是相关但不完全相同的概念。 方法&#xff08;Method&#xff09;&#xff1a;在对象中&#xff0c;方法是对象的属性&#xff0c;但它的值是一个函数。方法可以通过对象来调用&#xff0c;并且可以访问对象的属性和其他方法。 …

从《离婚律师》中学习代理模式

〇、前言 在2014年的时候&#xff0c;有一部非常火爆的电视剧叫做《离婚律师》&#xff0c;里面讲述了两名离婚律师池海东和罗郦的爱恨情仇&#xff0c;片子非常好看&#xff0c;当时我自己也怒刷了好几遍。 那么&#xff0c;在本剧的第四集中&#xff0c;有一段非常搞笑的剧情…

Linux学习之逻辑卷LVM用途和创建

理论基础 Linux文件系统建立在逻辑卷上&#xff0c;逻辑卷建立在物理卷上。 物理卷处于LVM中的最底层&#xff0c;可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列&#xff0c;这都可以。卷组建立在物理卷之上&#xff0c;一个卷组可以包含多个物理卷&#xff0c;而且在卷组…

新手小白如何租用GPU云服务器跑深度学习

最近刚学深度学习&#xff0c;自己电脑的cpu版本的pytorch最多跑个LexNet&#xff0c;AlexNet直接就跑不动了&#xff0c;但是作业不能不写&#xff0c;实验不能不做。无奈之下&#xff0c;上网发现还可以租服务器这种操作&#xff0c;我租的服务器每小时0.78人民币&#xff0c…