藍橋杯算法提高 拿糖果


原題:

  算法提高 拿糖果   時間限制: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;
}


注意!

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



 
粤ICP备14056181号  © 2014-2021 ITdaan.com