|
发表于 2022-7-11 09:57:32
|
显示全部楼层
本楼为最佳答案
本帖最后由 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;
- }
复制代码 |
|