|  | 
 
| 
只a了一个点,找了好久,结果改了之后总是全错。
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 
 复制代码#include<bits/stdc++.h>
using namespace std;
int k,n,ans;
int a[20],b[100];
bool pr[312501];
void pro(){
    for(int i=2;i<177;i++){
        if(i%2==1||i==2){
            for(int j=i*i;j<=312500;j+=2){
                if((j%i==0||pr[j])){
                    pr[j]=true;
                }
            }
        }
        else{
            for(int j=i*i+1;j<=312500;j+=2){
                if(j%i==0||pr[j]){
                    pr[j]=true;
                }
            }
        }
        
    }
}
// int cc(int ns){
//     for(int i=0;i<ans;i++){
//         if(ns==b[i]){
//             return 0;
//         }
//     }
//     b[ans]=ns;
//     return 1;
// }
void z(int i,int an,int step){
    if(step==k){
        //cout<<an+a[i]<<endl;
        if(!pr[an+a[i]]){
            //ans+=cc(an+a[i]);
            cout<<an+a[i]<<endl;
            ans++;
        }
    }
    else{
        for(int l=i;l<=n;l++){
            z(l+1,an+a[i],step++);
        }
    }
}
int main(){
    pro();
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int o=0;
    for(int i=0;i<n-k;i++){
        z(i,0,1);
    }
    cout<<ans;
    return 0;
} 
 本帖最后由 jhq999 于 2022-7-12 11:46 编辑 
应该先把奇偶分类 
然后奇数选择奇数个,偶数=k-选择奇数的个数 
然后再判断和是否为素数(判断时枚举的因子应该都是奇数)
 复制代码typedef struct GETSUSU
{
    int *num,*jisu,*ousu,*numk;
    int ncount,jisucount,ousucount,k;
    int jisuseek,oususeek,jisuselect,tongjicount;
}GSS,*pGSS;
int ousu(pGSS pgss,int n)
{
    if(0==n)
    {
        for(int i=0;i<pgss->k;i++)
        {
            printf("%4d",pgss->numk[i]);
        }
        printf("\n");
        pgss->tongjicount+=1;
        return 1;
    }
    for(int i=pgss->oususeek;i<=pgss->ousucount-n;i++)
    {
        pgss->numk[pgss->jisuselect+n-1]=pgss->ousu[i];
        pgss->oususeek=i+1;
        ousu(pgss,n-1);
        pgss->oususeek=i;
    }
    return 0;
}
int jisu(pGSS pgss,int n)
{
    if(0==n)
    {
        pgss->oususeek=0;
        ousu(pgss,pgss->k-pgss->jisuselect);
        return 1;
    }
    for(int i=pgss->jisuseek;i<=pgss->jisucount-n;i++)
    {
        pgss->numk[n-1]=pgss->jisu[i];
        pgss->jisuseek=i+1;
        jisu(pgss,n-1);
        pgss->jisuseek=i;
    }
    return 0;
}
int combination(int a,int b)
{
    int sum1=1,sum2=1;
    for(int i=a;i>a-b;i--)sum1*=i;
    for(int i=1;i<=b;i++)sum2*=i;
    return sum1/sum2;
}
int main()
{
    GSS gss;
    int n=0,k=0,i=0,j=0,t=0;
    scanf("%d%d",&n,&k);
    gss.k=k;
    gss.ncount=n;
    gss.num=(int*)calloc(n,sizeof(int));
    gss.numk=(int*)calloc(k,sizeof(int));
    gss.jisuseek=gss.oususeek=0;
    for(i=0,j=n-1;i<j+1;)
    {
        scanf("%d",&t);
        if(t%2)gss.num[i++]=t;
        else
            gss.num[j--]=t;
    }
    gss.jisucount=i,gss.ousucount=n-i;
    gss.jisu=gss.num,gss.ousu=gss.num+i;
    for(i=0;i<n;i++)printf("%4d",gss.num[i]);
    printf("\n");
    gss.tongjicount=0;
    int sum=0;
    for(i=1;i<=gss.jisucount;i+=2)
    {
        sum+=combination(gss.jisucount,i)*combination(gss.ousucount,k-i);
        gss.jisuseek=gss.oususeek=0;
        gss.jisuselect=i;
        jisu(&gss,i);
    }
    printf("\n%d",gss.tongjicount);
    printf("\n%d",sum);
    free(gss.numk);
    free(gss.num);
    return 0;
}
 | 
 |