首先是一道暴力枚举的例题,然后陈述枚举法的定义和暴力指的是什么意思;
题目描述
有一天,mirror给了kyoma一个数x,让kyoma找到一个正整数y>=2,使得y-x的绝对值最小。
但是kyoma觉得这样做太简单了,于是她反问mirror,要求在满足上一个条件的同时,这个y中的每个质因数均恰好出现2次。
mirror感到很困难,你能够帮帮她吗?
输入
第一行输入一个整数T(1<=T<=50)
每组数据有一行,一个整数x(1<=x<=10^18)
输出
对于每组数据,输出一行y-x的最小绝对值
样例输入
5
1112
4290
8716
9957
9095
样例输出
23
65
67
244
70
一、题目信息: 1.绝对值——>y可能比x小,可能比x大,但是满足条件的y一定是在x周围的——>while(x–) while(x++) 2.质因数(把喵喵坑的好苦啊)——>给定一个数n,n的因数是质数,则称该数为质因数 3.y中的每个质因数均恰好出现两次——>y一定是一个平方数——>y一定是一个合数——>合数可以表示成若干个质数相乘的形式 ↓ 从2开始验证,在sqrt(y)中只能出现一次,出现两次以上,该数一定不符合条件,且通过验证的数一定是质数
二、代码实现:
typedef long long ll;
while(t–) (我学了一些小改变)
#include
#include
using namespace std;
typedef long long ll;
bool judge(ll y)
{
bool re=true;
if(sqrt(y)!=(ll)sqrt(y))
{
return false;
}
ll s=sqrt(y);
for(ll i=2;s!=1;i++)
{
if(s%i==0)
{
s/=i;
if(s%i==0)
{
return false;
}
}
}
return re;
}
int main()
{
int T;
ll x;
ll y;
cin>>T;
ll minus,mm,min;
while(T--)
{
cin>>x;
y=x;
while(y)
{
minus=x;
if(judge(y))
{
minus=abs(x-y);
break;
}
y--;
}
y=x+1;
while(1)
{
mm=x;
if(judge(y))
{
mm=abs(x-y);
break;
}
y++;
}
min=mm
(声明:完全是个人理解,不是课本上的官方定义,有理解不对的地方,求求你告诉我)
暴力法:从题意出发,不运用什么技巧,按照题目的条件或者是数学公式,顺序解题。 (在暴力的过程中可能会发现简单解题的方法,例如:含有多个变量的等式,可能可以减少变量,从而可能减少循环)
枚举法与穷举法:根据题目给出的限制条件,挨个数据进行检验,最终找出符合条件的答案。(在范围内,挨个判断挨个找) 枚举法的缺点:数据量大的话会导致时间崩溃 枚举的一般结构:while循环 枚举解题的基本思路: 1.确定枚举对象,枚举范围和判断条件 2.枚举可能的解,验证
经典问题:百钱买百鸡
有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?