题目描述
营委会按照惯例将在该校学生中挑选一位小旗手,今年的挑选方法如下: 由学校推荐N 名学生100≤N≤1000000,将他们依次编号为1,2,…N,然后:
-
求出2 到 N 之间的全部素数,将它们记为X1,X2,…Xk
-
将得到的这 K 个素数,每个素数加上它的序号。如:2是最小素数,则2+1,3是第二个素数,则3+2,…如此操作后得到新的 K 个数Y1,Y2,…Yk
-
再找出Y1,Y2,…Yk 中的素数Z1,Z2,…Zm
-
将这m 个素数相加,得到的和除以(N+1)后得到的余数,该余数所表示的编号学生即为挑选到的小旗手。
输入
一个整数N
输出
一个整数(挑选到的小旗手的编号)
输入#1
121
输出#1
92
思路:
这题看似很难,其实一点都不简单......一直新建数组,改变,稍不留神就会搞错(毕竟.....谁不是Debug过来的呢?别看我,因为我也是) 那么,我们就好好扒一扒!
1.定义x数组(y和z被我吃了,具体看后面),变量(包括n、数组的下标和最终的答案)和判断质数的函数
2.求一下2~n的质数,放入x数组中(用到第一个下标)
3.遍历x数组,加上序号
4.求出数组里的质数,放入y数组?不,没必要,是质数直接累加
5.输出
艰难的AC之路之——AC代码:
#include <bits/stdc++.h>
using namespace std;
int x[1000005];
bool isPrime(int n)
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
return 0;
}
}
return n>=2;
}
int main()
{
int n;
cin >> n;
int pos1=0;
for(int i=2;i<=n;i++)
{
if(isPrime(i))
{
x[pos1++]=i;
}
}
int sum=0;
for(int i=0;i<pos1;i++)
{
x[i]+=i+1;
if(isPrime(x[i]))
{
sum+=x[i];
}
}
cout<<sum%(n+1);
return 0;
}