【0基础百日刷题】洛谷刷题知识拾遗

news2025/7/8 6:46:13

百日刷题

  • 一.洛谷刷题得
  • 1.P1420差分数组
    • 2.P2669数列求和
      • 3.P1307数字反转
        • 4.P5725三角形
          • 5.P1980计数问题
            • 6.P1217回文质数

在这里插入图片描述

刷题得意义:
有时候会发现一个简单的题目总是通不过测试,调试一次 就能找出一处bug。这都是我们编程时对逻辑的思考不充分而导致的失误。

  1. 刷题就是为了找出我们自己常犯的错误,总结归纳后,在以后避免出现错误。
  2. 学习体会算法优化,减少代码复杂度。
  3. 见识到大佬的写法,拓展自己的知识面

一.洛谷刷题得

1.P1420差分数组

我们先看一下题目描述

在这里插入图片描述
分析:题目要求两行输入,第一行输入的n是第二行数字的个数。而我们需要输出n个数中,连号个数的最大值
eg:1 2 3 8 9 5 6 7 8 9则输出5.
避坑要点
1.输出的是连号的最大值,所以可能有多个连号,并且有大小之分,所以不能单单只用一个一次连号的计数器。
2.计算连号的个数时,比如

int count = 0;
if((ch[i]+1)==ch[i+1])
{
	count++;	
}

我们仔细一想就可以发现计数器的值小了1,所以我们在定义count时将它初始化为1,才合情合理。
拓展知识解法:我们将输入的n个数存入数组后.连号也就是元素加一等于下一个元素的值,这里我们就可在定义一个数组也就是差分数组,

int main() 
{
	int a[100001], d[100001];
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) 
	{
		scanf("%d", &a[i]);
		d[i] = a[i] - a[i - 1];
	}

数组d[i]的元素就是a[i]减去上一个元素的差值,如果数组元素较大 并且要进行频繁的区间操作时,常会用到差分数组牺牲内存,换取时间上的高效。
我们还需要创建两个变量一个用来计数连号的个数,一个用来接受最大值,逻辑理明,代码奉上,大家仔细体会。


#include <stdio.h> 
 
int a[100000], d[100000];
int main() 
{
	int n, num = 1, count = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) 
	{
		scanf("%d", &a[i]);
		d[i] = a[i] - a[i - 1];
	}
	for (int i = 1; i <= n+1; i++) 
	{
		if (d[i] == 1) 
			count++;
		if (d[i] != 1) 
		{
			if (count > num) num = count;
			count = 0;
		}
	}
	if (num > 1) 
		printf("%d", num+1);
	else 
		printf("1");
	return 0; 
}

2.P2669数列求和

先看一下题目描述
在这里插入图片描述
分析:我们可以将收到相同金币的天数看为一个数列的项 比如收到1金币 2金币 3金币 …天数看成等差数列就是:1 2 3 4 5 6 7 8 9 …
在这里插入图片描述
不管k在n的左端还是右端,我们先判断k的值在哪个n中


int the_world(int k)
{
	int n = 1;
	while (1)
	{
		if (n * (n + 1) / 2 >= k)
		{
			return n;
		}
		n++;
	}
}

int main()
{
	int i, k, n;
	int sum = 0;
	scanf("%d", &k);
	n = the_world(k);

	return 0;
}

算出n值后我们接着讲金币数算出:

	for (i = 1; i <= n; i++)
	{
		sum += i * i;
	}
	sum += n * (k - n * (n + 1) / 2);

我们先用一个for循环算出n的天数下的总金币数,又因为k不一定在n天数中的最右端,所以我们还要减去n * (k - n * (n + 1) / 2) n代表金币数,k减去n求和可以算出相差的天数。最后将sum打印出来就可以AC这题了。

3.P1307数字反转

在这里插入图片描述避坑要点:我们将输入的数组作为字符存进数组,如果直接倒序打印的话,会出现一下错误
在这里插入图片描述
在这里插入图片描述
所以我们需要注意负号和0的处理
我们想到如果输入的是负数的话,我们就先将负号打印出来。

	if (ch[0] == '-')
	{
		printf("-");
	}

那对于0我们应该怎么处理呢?这里有一种巧妙的思路,可以学习一下
我们对输入的字符倒序检测,如果是0则继续,知道检测到数组第一个非0数,将此时的循环数i保留下来,在下面的遍历打印中,不初始化i,直接使用保留下来的i
在这里插入图片描述
下面完整代码奉上:

#include <stdio.h>
#include <string.h>



int main()
{
	char ch[11];
	int n=0;
	gets(ch);
	int len = strlen(ch);
	if (ch[0] == '-')
	{
		printf("-");
	}
	int i = 0;
	for (i=len-1;i>=1;i--)
	{
		if (ch[i] != '0')
			break;
	}
	for (; i >= 0; i--)
	{
		if (ch[i] != '-')
		{
			printf("%c", ch[i]);
		}
	}		
	return 0;
}


4.P5725三角形

我们再来看一下这一题:
在这里插入图片描述
分析:打印矩形没啥难度,需要注意的是需要补0的输出格式,这里我们要了解:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ccbd16019f514227a1412c611d1576a3.png




	int n;
	scanf("%d", &n);
	int i = 1;
	int j = 1;
	int m = n;
	while (m!=0)
	{
		for (; i <= n; i++)
		{
			for (; j <=i*n; j++)
			{
				printf("%02d", j);
			}
			printf("\n");
			m--;
		}
	}

看看效果:在这里插入图片描述
问题在于如何将这个三角形打印出来


我们想这个三角形真是奇怪 ,, 如果要求的是这样的在这里插入图片描述
那我轻松可以实现:

#include <stdio.h>

int main()
{
	int n = 0;
	int j = 1;
	int k = 1;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{

		for (k = 1; k <= i; k++)
		{
			printf("%02d", j++);
		}
		printf("\n");
	}
	return 0;
}

而题目要求的三角形在这里插入图片描述
可以观察出在打印每一行数之前,需要先打印n-行数个空格,
代码奉上:


#include <stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int i = 1;
	int j = 1;
	int m = n;
	while (m!=0)
	{
		for (; i <= n; i++)
		{
			for (; j <=i*n; j++)
			{
				printf("%02d", j);
			}
			printf("\n");
			m--;
		}
	}
	int k = 1;

	int c = 1;
	printf("\n");
	for (i=0;i<n;i++)
	{
		for (j = n-i-1; j >0; j--)
		{
			printf("  ");
		}
		for (k = i + 1; k > 0; k--)
		{
			printf("%02d", c);
			c++;
		}
		printf("\n");

	}
	return 0;
}
5.P1980计数问题

在这里插入图片描述分析:根据题目描述,我们需要遍历从1到n的数并判断某个数 出现的次数,这里我们就需用到%10/10来判断一个数的每一位。此方法基本框架是:

while (tmp)
	{
		if (tmp % 10 == x)
		{
			count++;
		}
		tmp /= 10;
	}	

%10可以拿出某个数的个位,/10可以将此数的个位拿下去。
我们可以解出此题:

#include <stdio.h>

int main()
{
	int n,x;
	scanf("%d %d", &n, &x);
	int count = 0;
	int i = 0;
	for (i = 1; i <= n; i++)
	{
		int tmp = i;
		while (tmp)
		{
			if (tmp % 10 == x)
			{
				count++;
			}
			tmp /= 10;
		}	
	}
	printf("%d", count);
	return 0;
}

避坑要点:我使用了tmp代替了i,是防止while循环和判断改变i的值,影响for循环的进行,从而出现错误。

6.P1217回文质数

在这里插入图片描述
我们根据题目要求和提示,先写遍历和判断逻辑:

#include <stdio.h>
#include <math.h>

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	int i = 0;
	for (i = a; i <= b; i++)
	{
		if ((is_hui(i)) && (is_form(i)))
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

然后再分别编写回文数和素数的函数:

int is_form(int i)
{
	int j = 0;
	for (j = 2; j<=sqrt(i); j++)
	{
		if (i % j == 0)
			return 0;
	}
	return 1;
}
int is_hui(int i)
{
	int k = 0;
	int tmp = i;
	while (i != 0)
	{
		k = i % 10 + k * 10;
		i /= 10;
	}
	if (k == tmp)
	{
		return 1;
	}
	else
		return 0;
}

k = i % 10 + k * 10可以将i的每一位保留下来并且倒序储存,是个技巧 。 但是两个函数写完后 我们提交洛谷时会发现有超时的监测点,
这里有个小知识点,一亿之内最大的回文数是9989899,我们对遍历条件可以进行优化:

int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	int i = 0;
	if (b > 10000000)
	{
		b = 10000000;
	}
	for (i = a; i <= b; i++)
	{
		if ((is_hui(i)) && (is_form(i)))
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

再次提交,就可以通过了!

如果调试一个程序让你很苦恼,千万不要放弃,成功永远在拐角之后,除非你走到拐角,否则你永远不知道你离他多远,所以,请记住,坚持不懈,直到成功。

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

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

相关文章

听说,清华毕业分享出Redis实战视频及文档,共2.3G

前言 首先我们先来看一下redis的概念&#xff1a; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。从2010…

【App自动化测试】(三)使用Appium进行自动化用例录制

目录1. Appium Inspctor 功能2. Appium inspector 页面结构3. 使用Appium Inspctor 进行用例录制3.1 获取 app 的信息3.2 配置待测应用3.3 使用Appium Inspector进行自动化脚本录制3.3.1 操作步骤3.3.2 自动化测试用例结构分析3.3.2.1 Appium Inspector生成用例脚本3.3.2.2 对A…

数据结构-难点突破(C++实现并查集+路径优化,详解哈夫曼编码树)

文章目录1. 并查集2. 哈夫曼编码树1. 并查集 并查集是一个多棵树的集合&#xff08;森林&#xff09;。 并查集由多个集合构成&#xff0c;每一个集合就是一颗树。 并&#xff1a;合并多个集合。查&#xff1a;判断两个值是否再一个集合中。 每棵树存在数组中&#xff0c;使…

js 中的 Event Loop 以及 宏任务 与 微任务

目录前言1、JS 的 执行引擎 与 执行环境2、js 是单线程的一、事件循环&#xff08;Event Loop&#xff09;二、任务队列三、宏任务 与 微任务1、宏任务2、微任务3、宏任务与微任务的运行机制四、Event Loop 实例案例一案例二前言 1、JS 的 执行引擎 与 执行环境 简单来说&…

SpringCloud微服务(八)——OpenFeign服务调用

OpenFeign服务调用 SpringCloud github官网&#xff1a;https://github.com/spring-cloud/spring-cloud-openfeign Feign是一个声明式的Web Service客户端。它的出现使开发Web Service客户端变得很简单。使用Feign只需要创建一个接口加上对应的注解&#xff0c;比如&#xf…

基于java+springboot+mybatis+vue+elementui的人职匹配推荐系统

项目介绍 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;对于人职匹配推荐系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了人职匹配推荐系统&#xff0c;它彻底改变…

分享一下前几个月我做的超炫的登录页面

先给大家看看登录页面的效果演示 这个登录页面分为三个部分&#xff08;页面切换&#xff1a;连续按五次V&#xff0c;大小写都可以&#xff09; 第一个&#xff08;最初的鱼儿游动页面&#xff09; 登录、切换页面、和鱼儿游动这个页面的代码就不放在这里了&#xff0c;这个虽…

RabbitMQ 入门案例项目

写在前面 本文不作消息队列的实现原理、异步处理优劣、rabbitmq安装说明、消息工作模式等内容分析&#xff0c;只讲述rabbitmq实际开发中的步骤说明&#xff0c;帮助同学快速上手体验消息队列的使用。 本文使用SpringAMQP&#xff0c;并非rabbitmq官方文档上的原生http请求连…

Jupyter notebook在超算平台上使用的详细教程

Jupyter Notebook 的本质是一个 Web 应用程序&#xff0c;便于创建和共享文学化程序文档&#xff0c;支持实时代码&#xff0c;数学方程&#xff0c;可视化和 markdown。 用途包括&#xff1a;数据清理和转换&#xff0c;数值模拟&#xff0c;统计建模&#xff0c;机器学习等等…

LeetCode 数据结构与算法:最大子数组和

打开我的题库&#xff0c;调为简单难度。 计算最大子数&#xff0c;直接给我难住。 报错铺满屏幕&#xff0c;凝望没有思路。 缝缝补补做出&#xff0c;击败零个用户。 翻阅评论找补&#xff0c;令我勃然大怒。 打开思维第一步&#xff0c;编写代码求数组&#xff0c; …

报错解决:Process finished with exit code -1073741819 (0xC0000005)

简单记录一下程序异常终止&#xff0c;抛出 Process finished with exit code -1073741819 (0xC0000005) 的解决方法。 一、程序中文件位置错误/缺少文件 位置错误1&#xff1a;如果使用相对路径的话&#xff0c;推荐换成绝对路径进行排查。位置错误2&#xff1a;如果使用了o…

CAN总线协议测试拓扑图

记录测试CAN总线协议&#xff0c; CAN总线目前主要应用在汽车。 记录在PC使用USB-CAN连接测试

Talk预告 | Salesforce AI研究院研究科学家徐嘉诚:文本生成中的结构化解码

本期为TechBeat人工智能社区第457期线上Talk&#xff01; 北京时间11月23日(周三)20:00&#xff0c;Salesforce AI研究院研究科学家——徐嘉诚的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “文本生成中的结构化解码”&#xff0c;届时将详细讲解…

学会用数据分析汇报工作,升职加薪指日可待

你是否每天的八小时工作时长&#xff0c;分成八瓣用&#xff0c;却仍被领导安排众多工作&#xff1f;明明做了很多事&#xff0c;领导依旧认为工作量不饱和&#xff1f;这样的现象在职场中早已司空见惯&#xff0c;不足为奇了&#xff0c;但是究其原因是什么呢&#xff1f;工作…

Android App网络通信中通过runOnUiThread快速操纵界面以及利用线程池Executor调度异步任务实战(附源码 简单易懂)

运行有问题或需要源码请点赞关注收藏后评论区留言私信~~~ 一、通过runOnUiThread快速操纵界面 因为Android规定分线程不能够直接操纵界面&#xff0c;所以它设计了处理程序工具&#xff0c;由处理程序负责在主线程和分线程之间传递数据&#xff0c;如果分线程想刷新界面&#…

精心整理16条MySQL使用规范,减少80%问题

1. 禁止使用select * 阿里开发规范中&#xff0c;有这么一句话&#xff1a; **select *** 会查询表中所有字段&#xff0c;如果表中的字段有更改&#xff0c;必须修改SQL语句&#xff0c;不然就会执行错误。 查询出非必要的字段&#xff0c;徒增磁盘IO和网络延迟。 2. 用小表…

小学生python游戏编程arcade----敌人精灵上方显示方框及子弹显示问题

小学生python游戏编程arcade----敌人精灵上方显示方框及子弹显示问题前言1、敌人精灵上方显示方框1.1 修改enemy_tank类1.2 引用1.3 效果图2、调整方法2.1 类方法2.2 类的引用2.3 效果图2.4 大小位置调整后3、子弹过线自动消失3.1 子弹的更新中3.2 原因查到&#xff0c;把以下代…

day11 多级缓存

day11 多级缓存 1、什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; 请求要经过 Tomcat 进行处理&#xff0c;Tomcat 的性能成为整个系统的瓶颈Red…

数字孪生助力轨道交通安保可视化应用

截至2020年12月31日&#xff0c;全国&#xff08;不含港澳台&#xff09;共有44个城市开通运营城市轨道交通线路233条&#xff0c;运营里程7545.5公里&#xff0c;车站4660座&#xff0c;完成客运量175.9亿人次&#xff0c;进站量109.1亿人次。针对轨道交通地铁站内日常监测、事…

牛客网语法篇练习分支控制(一)

1.据说智商140以上者称为天才&#xff0c;KiKi想知道他自己是不是天才&#xff0c;请帮他编程判断。输入一个整数表示一个人的智商&#xff0c;如果大于等于140&#xff0c;则表明他是一个天才&#xff0c;输出“Genius”。 while True:try:a int(input())if a >140:print…