蓝桥杯算法提高 拿糖果


原题:

  算法提高 拿糖果   时间限制:1.0s   内存限制:256.0MB     问题描述  妈妈给小B买了N块糖!但是她不允许小B直接吃掉。
  假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数。这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走P块糖。然后小B就可以接着拿糖。
  现在小B希望知道最多可以拿多少糖。
输入格式  一个整数N输出格式  最多可以拿多少糖样例输入15样例输出6数据规模和约定  N <= 100000

思路:

一开始看到这个题,我就想到先求素数表,但是后来仔细一想,每次都取质因数,到后来还不是相当于取得合数,我就直接用的sqrt(M),结果对了,代码如下:

#include <math.h>
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
int sum = 0,M = N;
while(1)
{
int m = (int)sqrt(M);
sum += m;
M -= 2 * m;
if(M <= 3)
break;
}
cout<<sum;
return 0;
}

后来我又仔细一想,这个不论初始的N有多大,到最后结果只有一个:M<=3,因为当M=3的时候,就不能再取了,比根3小的只有1,而1不是质数;而当M为偶数的时候,最后M肯定是0,所以直接判断输入的是不是偶数就可以了:

#include <math.h>
#include <iostream>
using namespace std;
int main()
{
int N;
cin>>N;
if(N <= 3)
;
else if(N % 2 == 0)
cout<< N / 2;
else
cout<<(N - 3) / 2;
return 0;
}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: