首页 > 其他分享 >洛谷 P8615 [蓝桥杯 2014 国 C] 拼接平方数

洛谷 P8615 [蓝桥杯 2014 国 C] 拼接平方数

时间:2024-08-25 11:52:14浏览次数:6  
标签:P8615 平方 洛谷 10 int sqrt t1 蓝桥 define

题面

题目描述

小明发现 $49$ 很有趣,首先,它是个平方数。它可以拆分为 $4$$9$,拆分出来的部分也是平方数。$169$ 也有这个性质,我们权且称它们为:拼接平方数。

$100$ 可拆分 $1,00$,这有点勉强,我们规定,$0,00,000$ 等都不算平方数。

小明想:还有哪些数字是这样的呢?

你的任务出现了:找到某个区间的所有拼接平方数。

输入格式

两个正整数 $a,b(a<b<10^6)$

输出格式

若干行,每行一个正整数。表示所有的区间 $[a,b]$ 中的拼接平方数,从小到大输出。

样例 #1

样例输入 #1

169 10000

样例输出 #1

169
361
1225
1444
1681
3249
4225
4900
9025

提示

时限 1 秒, 256M。蓝桥杯 2014 年第五届国赛

解题

题目大意

给定一个区间,求区间中所有拼接平方数。

思路

先判断该区间某数是否是平方数,再将该数拆成两部分,分别判断其是否是平方数,如果是就输出。要注意 $sqrt()$ 所表示的数不是整型,所以要强制转型 $int(sqrt())$ 才能判断(我在这卡了半天)。

根据题目意义,我们可以写出一个判断这个数是否为平方数的$O(log(n))$的函数:

bool pd(int n)
{
	int i;
	for(i=1;i<=sqrt(n);i++)
    {//为了节省时间,到n的平方根就好了
		if(i*i==n)
        {//如果有一个整数的平方等于n
			return true;
			break;
		}
	}
    return false;
}

但是为了节省时间,我们可以直接用  $O(1)$ 的C++自带的函数 $sqrt()$ 来判断:

int(sqrt(x))*int(sqrt(x))==x

这样我们就可以得出一段较为简洁明了的代码了。

方法1

将该数的每位数用数组存起来,为了包含有 0 的情况,我们用倒序存储,再倒序组成两个数,判断这两个数后输出就好了。

核心代码
int temp=i;tot=0;
			while(temp!=0)
			{
				a[++tot]=temp%10;
				temp/=10;
			}
			int t=0;
			for(int j=tot;j>1;j--)
			{
				t*=10;t+=a[j];
				if(int(sqrt(t))*int(sqrt(t))==t)
				{
					int t1=0;
					for(int k=j-1;k>=1;k--)
						t1=t1*10+a[k];
					if(int(sqrt(t1))*int(sqrt(t1))==t1 && t1!=0)
					{
						printf("%d\n",i);
						break;
					}
				}
			}

方法2

将该数转换成字符串,再分成两个子串,然后转回整形,判断一下就可以输出了。这两个方法实际上是差不多的。

核心代码
string s=to_string(i);
for(int j=1;j<s.size();j++)
{
	string a=s.substr(0,j),b=s.substr(j);
	int aa=stoi(a),bb=stoi(b);
	if(int(sqrt(aa))*int(sqrt(aa))==aa && int(sqrt(bb))*int(sqrt(bb))==bb && bb!=0 && aa!=0)
	{
		printf("%d\n",i);
		break;
	}
}

代码实现

方法1

#include<bits/stdc++.h>
#define Sqrt(x) int(sqrt(x))//方便打字 
#define Z return
#define X 0
#define Y ;
using namespace std;
int a[10],tot;
int main()
{
	int l,r;
	scanf("%d%d",&l,&r);
	for(int i=l;i<=r;i++)
	{
		if(Sqrt(i)*Sqrt(i)==i)//是平方数 
		{
			int temp=i;tot=0;//存数组 倒序存储 
			while(temp!=0)
			{
				a[++tot]=temp%10;
				temp/=10;
			}
			int t=0;
			for(int j=tot;j>1;j--)//倒序组合 
			{
				t*=10;t+=a[j];//加上当前的一位数 重组第一个数 
				if(Sqrt(t)*Sqrt(t)==t)
				{
					int t1=0;
					for(int k=j-1;k>=1;k--)
						t1=t1*10+a[k];//重组第二个数 
					if(Sqrt(t1)*Sqrt(t1)==t1 && t1!=0)
					{
						printf("%d\n",i);
						break;
					}
				}
			}
		}
	}
	Z X Y//嘻嘻 
}

方法2

#include<bits/stdc++.h>
#define Sqrt(x) int(sqrt(x))//方便打字 
#define Z return
#define X 0
#define Y ;
using namespace std;
int a[10],tot;
int main()
{
	int l,r;
	scanf("%d%d",&l,&r);
	for(int i=l;i<=r;i++)
	{
		if(Sqrt(i)*Sqrt(i)==i)//是平方数 
		{
			string s=to_string(i);//转字符串 
			for(int j=1;j<s.size();j++)
			{
				string a=s.substr(0,j),b=s.substr(j);//拆成两个子串 
				int aa=stoi(a),bb=stoi(b);//转整形 
				if(Sqrt(aa)*Sqrt(aa)==aa && Sqrt(bb)*Sqrt(bb)==bb && bb!=0 && aa!=0)
				{
					printf("%d\n",i);
					break;
				}
			}
		}
	}
	Z X Y//嘻嘻 
}

THE END 

若还有什么要补充的或者修改的大佬请评论

标签:P8615,平方,洛谷,10,int,sqrt,t1,蓝桥,define
From: https://blog.csdn.net/caizihao004/article/details/141501987

相关文章

  • 洛谷P2440 木材加工 题解
    这是我找到的一篇很久之前为了让我更好理解二分写的详细题解题目链接code:#include<bits/stdc++.h>#defineintlonglong#defineMAXN0x3f3f3f3f3f3f3f3f#defineMINN-0x3f3f3f3f3f3f3f3f#defineMiraiios::sync_with_stdio(0),cin.tie(0),cout.tie(0);usingnamespa......
  • P10902 [蓝桥杯 2024 省 C] 回文数组
    P10902[蓝桥杯2024省C]回文数组题解十年OI一场空,不开longlong见祖宗!思路:贪心题目要求将一个随机数组变成一串回文数,可执行的操作如下:相邻两个数同时加\(1\)单个数加\(1\)或减\(1\)由于一个数加\(1\)得到回文数和一个数减\(1\)得到回文数效果一样,我们可以不......
  • 洛谷P1605 迷宫
    原题题目描述给定一个方格的迷宫,迷宫里有处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。输入格式第一行为三个正整数,分......
  • 将洛谷私信接入Windows
    首先下载一个私信Github:https://github.com/GCSG01/LG_Show_Massger/archive/refs/heads/main.zip然后解压,找到src/settings.json,把你的洛谷cookie和UID填进去,点击Start.cmd运行。(其余的不要改)之后不出意外就会有两个窗口:AI功能:下载仓库:https://github.com/OI-liyi......
  • 题解:P10906 [蓝桥杯 2024 国 B] 合法密码
    本来以为字符串多大,结果就这点,直接暴力。枚举起始点,对于每个起始点枚举后面\(8\sim16\)位有没有能用的即可。最后答案为\(400\)。附:计算代码枚举代码如下:for(inti=0;i<n;++i){for(intlength=8;length<=16;++length){if(i......
  • 题解:P10903 [蓝桥杯 2024 省 C] 商品库存管理
    题目大意有一个初始化为\(0\)的长度为\(n\)的序列,现有\(m\)个操作,每次将区间\([L,R]\)中的数量加\(1\),求如果不做某个操作将会有多少个数量为\(0\)的量。解题思路当看见这句话时就想到了差分,这题我们可以使用差分先处理将所有的操作执行后的数组,然后在算出如果减......
  • 洛谷P10878 [JRKSJ R9] 在相思树下 III && 单调队列
    传送门:P10878[JRKSJR9]在相思树下III将军啊,早卸甲,他还在廿二,等你回家……一道练习单调队列的好题qwq题目意思:很明白了,不再复述。(注意$\foralli$表示对于任意的i,可理解为所有)思路:贪心是很明显的,因为我们要让最后的值最大,首先要把小的值删掉。最后的答案就是进......
  • 洛谷P1182 数列分段 Section II
    传送门:P1182数列分段SectionII消灭人类暴政,世界属于三体题目意思:题目说的很明白了思路:考虑部分分:20%的数据保证n<10,直接爆搜;40%的数据保证n<1000,n^2+前缀和搞定100%的数据:求每段最大和的最小值:明显的二分(n在10^5的范围也说明了这一点,因为二分查找的......
  • 洛谷P1540 [NOIP2010 提高组] 机器翻译答案
    #include<bits/stdc++.h>usingnamespacestd;/*数据结构:队列queue 桶:标记某个单词是否出现在内存中 t[i]=false:不在t[i]=true:在对于读入的每个单词x: 如果不存在单词x 存储(入队) t[x]=true 内存中元素个数(q.size())>M: t[q.front()]=falses; ......
  • 洛谷 P2590 [ZJOI2008] 树的统计 题解
    题目大意给你一个\(N\),然后再给你两个长度为\(N\)的序列。让你构造一个仅有\(0\)和\(1\)的\(N\timesN\)的正方形,但是要满足两个序列的顺序:第一个序列指的是该正方形每一行所构成的二进制数的大小顺序。第二个序列指的是该正方形每一列所构成的二进制数的大小顺序。......