四道编程题(涉及最大公约数最小公倍数,子序列等)

news2024/11/25 11:04:44

tips

1. scanf当是读取整数%d的时候,这时候如果它读取到\n,它就会停止读取。并且碰到空格的时候也会跳过。

  

2. getchar不需要传入参数,读取失败的时候会返回EOF。那getchar或者scanf到底是怎么从键盘上读取我输入的字符呢?在getchar/scanf与键盘中间有输入缓冲区,从键盘上输入的字符会先到输入缓冲区,然后它们从输入缓冲区中读取字符。按下enter,就是往输入缓冲区里面放入了一个换行符(\n)。

3. scanf与printf针对各种类型,而getchar与putchar只针对字符。

4. 当程序执行时一旦出现getchar,如果此时输入缓冲区里面没有东西,就会弹出一个界面,让你去输入字符(它读取不到就会返回EOF)。如果此时输入缓冲区里面有东西,那么getchar对抓去它干它自己的活。

如上,这样子是因为\n的ACSII码是10

5. 如下面这个代码可以打印数字字符

注意:getchar()读取的是字符,那么既然是字符肯定是一个一个的,又不是字符串。但当我一下子输入一串东西(此时输入缓冲区就已经有这么一串东西了,并且最后一个是\n),那然后当getchar如果在循环里面的话,它是一个一个字符这么读取并返回ACSII码的,并不是一步到位的。 

6. 使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。 

题目1

代码 

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int arr[100][100] = { 0 };
	//
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//
	int k = 0;
	int num1 = 0;
	int num2 = 0;
	char ret;
	//
	scanf("%d",&k);
	for (i = 0; i < k; i++)
	{
		getchar();
		scanf("%c %d %d", &ret, &num1, &num2);
		if (ret == 'r')
		{
			for (j = 0; j < m; j++)
			{
				int tmp = arr[num1 - 1][j];
				arr[num1 - 1][j] = arr[num2 - 1][j];
				arr[num2 - 1][j] = tmp;
			}
		}
		else if (ret == 'c')
		{
			for (j = 0; j < n; j++)
			{
				int tmp = arr[j][num1 - 1];
				arr[j][num1 - 1] = arr[j][num2 - 1];
				arr[j][num2 - 1] = tmp;
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

经验总结

1. scanf当是读取整数%d的时候,这时候如果它读取到\n,它就会停止读取。并且碰到空格的时候也会跳过。

2. 但是如果scanf读取字符%c的时候,这个时候需要特别注意了,输入缓冲区里面的如果没有被清除掉的话,那么它读取的就是\n,(按下enter键,相当于往输入缓冲区里面放一个\n)

题目2

代码 

#include <stdio.h>
int main()
{
	long long n = 0;
	long long m = 0;
	scanf("%lld %lld", &n, &m);
	//
	int num1 = n > m ? n : m;
	int num2 = n < m ? n : m;
	//
	while (num1 % num2 != 0)
	{
		int ret = num1 % num2;
		num1 = num2;
		num2 = ret;
	}
	int Div = num2;
	//
	printf("%lld\n", n * m / num2+num2);
	return 0;
}

经验总结

1. 求最大公约数用辗转相除法。
2. 两个数的最大公约数与最小公倍数的乘积等于这两个数的乘积。

题目3 

代码 

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	int num = 0;
	int sum = 0;
	scanf("%d", &num);
	//
	while (num)
	{
		int ret = num % 10;
		num /= 10;
		if (ret % 2 == 0)
		{
			sum += pow(10, i) * 0;
		}
		else
		{
			sum += pow(10, i) * 1;
		}
		i++;
	}
	printf("%d\n", sum);
	return 0;
}

经验总结

1. 对于一个数值,如果想要得到它n进制形式的每一位数只需要把这个数值不断%n,然后再/n去更新这个数值,如此循环往复。

2. 如果你要得到一个数值二进制形式下的每一位数,就可以把这个数值不断%2,然后再/2去更新这个数值,如此循环往复。但这样子的话是有缺陷的,比如对于负数而言。这时候对于负数而言的话,为了避免缺陷,需要把负数类型强制转化为unsigned int,这样子的话在数值上其实每个负数变成了很大很大很大的一个正数(我再次强调一下,在内存当中存的是二进制的补码,对正数而言,原码与补码都是一样的),虽然如此,但是那个二进制序列的形式仍然没有发生一丁点变化,这就没有背离我的初衷。

题目4

 

代码 

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[8000] = { 0 };
	gets(arr);
	int sz = strlen(arr);
	//
	int i = 0;
	long long C = 0;
	long long CH = 0;
	long long CHN = 0;
	for (i = 0; i < sz; i++)
	{
		if (arr[i] == 'C')
		{
			C++;
		}
		else if (arr[i] == 'H')
		{
			CH += C;
		}
		else if (arr[i] == 'N')
		{
			CHN += CH;
		}
	}
	printf("%lld\n",CHN);
	return 0;
}

经验总结 

1. 像我上面代码里的这种方法是比较有效率的,我只要从头到尾遍历一次数组就可以。
2. 以后有关数组的子序列问题其实这道题目也许可以作为参考。给我们提供了一种思路。


 

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

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

相关文章

VSCode入门

VSCode入门 零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#…

[附源码]Node.js计算机毕业设计高校创新学分申报管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

微服务实用篇4-消息队列MQ

今天主要来学习异步通讯技术MQ&#xff0c;主要包括初识MQ&#xff0c;RabbitMQ快速入门&#xff0c;SpringAMQP三大部分&#xff0c;下面就来一起学习吧。路漫漫其修远兮&#xff0c;吾将上下而求索&#xff0c;继续加油吧&#xff0c;少年。 目录 一、初识MQ 1.1、同步通讯…

文件历史记录无法识别此驱动器如何修复?

案例&#xff1a; 在电脑中尝试使用内置工具文件历史记录将文件备份到另一个硬盘时&#xff0c;发现如图所示的错误“文件历史记录无法识别此驱动器”&#xff0c;这可怎么办&#xff1f; 文件历史记录驱动器断开连接的原因 文件历史记录无法识别此驱动器的原因可能是启动类型…

四种排序(选择排序、冒泡排序、快速排序和插入排序)

四种排序&#xff08;选择排序、冒泡排序、快速排序和插入排序&#xff09;选择排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;冒泡排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;插入排序&#xff1a;完整代码&#xff1a;运行结果&#xff1a;快速排…

linux 环境异常登录的甄别方法

1、关于linux的登录记录 查看最近登录IP和历史命令执行日期 last 显示的最末尾的 使用last -10 看最新的 登录IP地址 时间 still仍在登录 选项&#xff1a; &#xff08;1&#xff09;-x&#xff1a;显示系统开关机以及执行等级信息 &#xff08;2&#xff09;-a&am…

SpringSecurity[3]-自定义登录逻辑,自定义登录页面,以及认证过程的其他配置

前一篇:SpringSecurity[2]-UserDetailsService详解以及PasswordEncoder密码解析器详解 链接:SpringSecurity[2]-UserDetailsService详解以及PasswordEncoder密码解析器详解_豆虫儿的博客-CSDN博客 五、自定义登录逻辑 当进行自定义登录逻辑时需要用到之前讲解的UserDetailsS…

Java泛型的作用以及如何使用(继承、接口、方法、通配符) 附源码

&#x1f34b;1. 泛型的定义 class 类名称<泛型标识, 泛型标识, ....>{private 泛型标识 变量名称;....... } 常用的泛型标识字符 :T, E, K, V E - Element (在集合中使用&#xff0c;由于集合中存放的是元素)&#xff0c;E是对各方法中的泛型类型进行限制&#xff0c;…

【微服务技术06】Nacos注册中心

【微服务技术06】Nacos注册中心 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 安装Nacos 安装nacos&#xff1a;https://github.com/alibaba/nacos/releases 单机启动&#xff1a;sh startup.sh -m standalone 访问&#xff1a;http://127.0.0.1…

操作系统,计算机网络,数据库刷题笔记10

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记10 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

yolov5修改骨干网络-使用pytorch自带的网络-以Mobilenet和efficientnet为例

通过 yolov5修改骨干网络–原网络说明 我们知道&#xff1a;yolov5.yaml中存放的是我们模型构建参数&#xff0c;具体构建过程在yolo.py中的parse_model函数&#xff0c;通过循环遍历yolov5.yaml给的参数&#xff0c;去寻找网络名称&#xff0c;并将args的参数传入网络&#xf…

获取bean的三种方式和注意事项

获取bean的三种方式和注意事项 spring-ioc.xml <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoc…

PUMA:DOA估计模式的改进实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

北京旅游HTML学生网页设计作品 dreamweaver作业静态HTML网页设计模板 北京旅游景点网页作业制作 HTML+CSS+JS

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

口诀速记 DataFrame 指定行列的数据

口诀速记DataFrame 指定行列的数据一、loc函数和iloc函数获取指定行列的数据二、loc和iloc的切片操作三、[] 语法获取指定行列的数据✅作者简介&#xff1a;大家好我是爱康代码 &#x1f4c3;个人主页&#xff1a;链接: 点一下这里就进入爱康代码的主页链接&#xff0c;欢迎参观…

深入:9种设计模式在Mybatis中的运用

虽然我们都知道有26个设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大量的设计模式&#xff0c;阅读源码并观察设计模式在其中的应用&#xff0c;能够更深入的理解设计模式。 Mybatis至少遇到了以下的设计模式的…

接口优化技巧

1. 批量思想&#xff1a;批量操作数据库 优化前&#xff1a; //for循环单笔入库 for(TransDetail detail:transDetailList){insert(detail); }优化后&#xff1a; batchInsert(transDetailList);打个比喻&#xff1a; 打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电…

怎么进行多人配音?建议收藏这些方法

相信不少小伙伴平时在网上冲浪的时候&#xff0c;经常会刷到一些搞笑视频吧。这些搞笑视频的配音&#xff0c;通常都是以一人分饰多角或者是多人互动对话的形式进行配音的。那有没有小伙伴有着不错的搞笑创意点子&#xff0c;但是苦于没有人配音呢&#xff1f;其实我们可以使用…

电脑之间通信的大致过程

本文来自对网络工程师之路内容的个人总结&#xff0c;仅供个人复习参考。 1.电脑之间通信就需要有线路&#xff0c;但是如果多台电脑互相之间需要通信&#xff0c;那么就需要有很多根线&#xff0c;每台电脑需要有多网卡&#xff0c;为了解决这个问题&#xff0c;(集线器)Hub就…

360度内环镜、内螺纹检测镜头、瓶盖检测镜头以及超中心镜头

用于孔洞状物体的360内部成像 提示&#xff1a; 内孔检测光学镜头 从外部检查腔内&#xff1b;无需在孔洞内放置光学探头&#xff1b;带孔对象的360度对焦&#xff1b;腔体内壁和底部都可以实现高分辨率成像&#xff1b;景深可使同一个镜头拍摄具有不同形状和尺寸的物体&…