求助
#include <bits/stdc++.h>using namespace std;
intf(int t)
{
int flag=1;
for(int i=2;i<=sqrt(t);i++)
{
if(t%i==0)
{
flag=0;
break;
}
else flag=1;
}
return flag;
}
int main()
{
int n,res =0;;
cin>>n;
vector<int>a;
vector<vector<int>>b;
for(int i=1;i<=n;i++)a.push_back(i);
do{
b.push_back(a);
}while(next_permutation(a.begin(),a.end()));
for(int i=0;i<b.size();i++)
{
for(int j=0;j<b.size()-1;j++)
{
if(!f(b+b))
{
res++;
}
}
}
cout<<res<<endl;
}
题目要求:游游想知道,有多少个长度为nn的排列满足任意两个相邻元素之和都不是素数。你能帮帮她吗?
我们定义,长度为nn的排列值一个长度为nn的数组,其中1到nn每个元素恰好出现了一次。
为什么我这样写不对呢 你的代码有一个问题,即你的函数f(t)只判断了t是否为素数,但题目要求的是判断相邻元素之和是否为素数。所以你需要修改你的代码逻辑。
你可以在计算相邻元素之和时,调用函数f()来判断是否为素数。如果相邻元素之和不是素数,则增加计数器res的值。
修改后的代码如下:
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int num) {
if (num <= 1) {
return false;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
int main() {
int n, res = 0;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
a[ i] = i + 1;
}
do {
bool flag = true;
for (int i = 0; i < n - 1; i++) {
if (isPrime(a[ i] + a)) {
flag = false;
break;
}
}
if (flag) {
res++;
}
} while (next_permutation(a.begin(), a.end()));
cout << res << endl;
return 0;
}
这样修改后的代码会正确计算满足条件的排列个数。
页:
[1]