题目链接:http://codeforces.com/contest/1076/problem/B
题意:给你一个n,让你设计一个程序如下要求:
1.若n = 0,结束程序
2.求出n的最小质数约数。
3.n减去最小质数约数。
求这个程序运行的次数。
题解:考虑一下,如果给出的n为偶数,那么他最小质数约数一定是2.那么结果就是n/2了。
若是个奇数。那么我们暴力找就行了。先打个素数表。然后暴力判断即可。若在运行过程中n变成偶数,那么就答案加上n/2。
素数表1e5即可
这里要特判一个情况。就是若给出n>1e5并且是个质数,那么我们特判一下即可。若在1e5的质数中都找不到约数,你们他就是个质数,直接输出1即可。因为本身自己就是最小的质数约数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5;
int prime[maxn];
void Prime (){
memset(prime,0,sizeof(prime));
prime[0] = prime[1] = 1;
for(int i = 2 ; i < 2e5 ; i ++){
if(prime[i] == 0){
for(int j = i + i ; j < 2e5 ; j += i){
prime[j] = 1;
}
}
}
}
int main(){
long long n ;
scanf("%lld",&n);
long long ans = 0 ;
Prime();
// for(int i = 0 ; i <=10 ; i ++)
// cout << prime[i] << endl;
if(n % 2 == 0){
printf("%lld",n/2);
return 0;
}
while(n){
if(n % 2 == 1){
int temp = -1 ;
for(int i = 2 ; i < 2e5 ; i ++){
if(prime[i] == 0 && n % i == 0){
temp = i;
break;
}
}
if(temp == -1){
ans = 1;
break;
}
// cout << temp << endl;
n -= temp;
ans ++;
// cout << ans << endl;
}
else {
ans += n /2;
break;
}
}
printf("%lld",ans);
}